Go中用compress/gzip压缩数据必须调用Close()以写入header/trailer,否则解压失败;支持内存压缩、文件流式压缩、级别控制(0-9)及带CRC校验的解压。
在 Go 中用 compress/gzip 压缩数据,核心是把原始字节流写入 gzip.Writer,再从其底层 writer 获取压缩后的内容。关键在于正确关闭 writer(触发 flush 和 trailer 写入),否则压缩数据不完整。
适合小量数据(如配置、日志片段)的内存内压缩:
bytes.Buffer 作为底层写入目标gzip.NewWriter 包裹 bufferWrite 写入原始数据Close() —— 否则 gz
ip 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 文件gzip.NewWriter
io.Copy 流式传输,自动分块读写gz.Close() 关闭压缩器,dst.Close() 关闭文件Close() 会把剩余压缩数据写出并写入 CRC 和长度 trailer,这步必不可少。
默认使用 gzip.DefaultCompression(等级 6)。可根据场景调整:
gzip.NoCompression(0):仅打包,无压缩,最快gzip.BestSpeed(1):优先速度gzip.BestCompression(9):最高压缩率,最慢gzip.NewWriterLevel(dst, level)
BestCompression;实时 API 响应建议 DefaultCompression 或 BestSpeed。
解压时用 gzip.NewReader,它会自动校验 gzip header 和 CRC:
ReadAll 或后续读取会返回 errorreader.Close(),释放资源(尤其处理多个流时)