Go中用compress/gzip压缩数据必须调用Close()以写入header/trailer,否则解压失败;支持内存压缩、文件流式压缩、级别控制(0-9)及带CRC校验的解压。

在 Go 中用 compress/gzip 压缩数据,核心是把原始字节流写入 gzip.Writer,再从其底层 writer 获取压缩后的内容。关键在于正确关闭 writer(触发 flush 和 trailer 写入),否则压缩数据不完整。
基础压缩:字符串或字节切片
适合小量数据(如配置、日志片段)的内存内压缩:
- 用
bytes.Buffer作为底层写入目标 - 创建
gzip.NewWriter包裹 buffer - 调用
Write写入原始数据 -
必须调用
Close()—— 否则 gzip header/trailer 缺失,解压会失败
var buf bytes.Buffer
gz := gzip.NewWriter(&buf)
gz.Write([]byte("hello world"))
gz.Close() // 不可省略
compressed := buf.Bytes() // ✅ 完整的 gzip 数据
压缩文件:边读边压,节省内存
处理大文件时,避免一次性加载全部内容到内存:
- 用
os.Open打开源文件,os.Create创建目标 .gz 文件 - 将 gz 文件句柄传给
gzip.NewWriter - 用
io.Copy流式传输,自动分块读写 - 最后
gz.Close()关闭压缩器,dst.Close()关闭文件
Close() 会把剩余压缩数据写出并写入 CRC 和长度 trailer,这步必不可少。
带压缩级别控制:平衡速度与压缩率
默认使用 gzip.DefaultCompression(等级 6)。可根据场景调整:
立即学习“go语言免费学习笔记(深入)”;
-
gzip.NoCompression(0):仅打包,无压缩,最快 -
gzip.BestSpeed(1):优先速度 -
gzip.BestCompression(9):最高压缩率,最慢 - 自定义等级:用
gzip.NewWriterLevel(dst, level)
BestCompression;实时 API 响应建议 DefaultCompression 或 BestSpeed。
解压数据:验证完整性 & 兼容性
解压时用 gzip.NewReader,它会自动校验 gzip header 和 CRC:
- 若数据损坏或非 gzip 格式,
ReadAll或后续读取会返回 error - 支持标准 gzip 文件(含 header/trailer),也兼容部分 HTTP 响应中省略 trailer 的情况(取决于 reader 实现)
- 解压后记得
reader.Close(),释放资源(尤其处理多个流时)










