Golang如何压缩和解压gzip_Golang gzip操作教程【指南】

张开发
2026/4/14 22:28:43 15 分钟阅读

分享文章

Golang如何压缩和解压gzip_Golang gzip操作教程【指南】
Go 的 compress/gzip 仅支持单文件压缩非 ZIP 替代品压缩需显式调用 Close() 写入尾部数据否则文件损坏解压 ZIP/tar.gz 必须路径清洗防 Zip Slip。Go 的 compress/gzip 只能压单个文件不是 ZIP 替代品 —— 想打包目录必须配 archive/tar 或 archive/zip。gzip.Writer 必须显式调用 Close()否则生成的 .gz 文件损坏很多人写完 io.Copy(gzWriter, src) 就结束结果用 gunzip -t 检查报 unexpected end of file。这是因为 gzip.Writer 内部有缓冲且 CRC 和 ISIZE 尾部数据只在 Close() 时写入。defer gzWriter.Close() 是安全写法但注意它在函数 return 后才执行 —— 若中间 panic 或提前 return可能漏掉别用 os.Open 直接读 .gz 文件内容来“验证”那只是二进制流解压必须用 gzip.NewReader()压缩级别可选gzip.NoCompression快、gzip.BestSpeed适合日志、gzip.DefaultCompression通用解压 .gz 文件时gzip.NewReader 之后必须检查 io.EOFgzip.Reader 不会在读完所有数据后自动返回 io.EOF而是可能再读一次才触发。不显式处理会导致循环卡死或漏数据。最稳妥是直接用 io.Copy(out, gr)它内部已正确处理 io.EOF若需逐块读如限速、校验每次 Read() 后必须检查 n 和 err当 err io.EOF 或 n 0 err nil 时停止gr.Close() 只释放资源不反映数据是否读完 —— 别靠它判断流边界压缩多个文件别硬套 gzip该上 archive/zip 或 tar.gzcompress/gzip 天然不支持多文件或路径结构。强行拼接多个文件进一个 .gz解压出来就是一团乱码。 Vozo Vozo是一款强大的AI视频编辑工具可以帮助用户轻松重写、配音和编辑视频。

更多文章