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视频编辑工具,可以帮助用户轻松重写、配音和编辑视频。

更多推荐