在 Go 中解压 gzip 文件需用 compress/gzip 包:先 os.Open 打开 .gz 文件,再 gzip.NewReader 包装为 io.Reader,最后用 bufio.Scanner 等读取;注意默认 Scanner 行长上限 64KB。

在 Go 语言中解压 gzip 文件(即读取 .gz 文件中的原始数据),核心是使用标准库 compress/gzip 和 io 相关包。你不需要手动处理 gzip 格式细节,只需创建一个 *gzip.Reader 包裹底层 reader,然后像读普通文件一样读取即可。
打开并解压 gzip 文件
最常见场景是读取本地 .gz 文件。需先用 os.Open 打开文件,再用 gzip.NewReader 包装:
- 确保文件以只读方式打开,且 defer 关闭文件句柄
-
gzip.NewReader返回一个实现了io.Reader的解压 reader,后续可直接用io.ReadFull、bufio.Scanner或io.Copy等读取 - 解压失败(如文件非 gzip 格式)会在首次读取时返回错误,不是在
NewReader阶段
逐行读取解压后的内容(适合文本日志)
若 gzip 文件内是文本(如 access.log.gz),推荐用 bufio.Scanner 流式读取,内存友好:
- 用
gzip.NewReader(f)获取解压 reader - 将其传给
bufio.NewScanner,无需额外缓冲层 - 注意:默认每行上限 64KB,超长行会报错;如需支持更长行,调用
scanner.Buffer(make([]byte, 64*1024), 1
一次性读取全部解压数据(适合小文件)
对体积较小的 gzip 文件(如配置、JSON 压缩包),可用 io.ReadAll 简洁获取原始字节:
立即学习“go语言免费学习笔记(深入)”;
- 解压 reader 可直接传给
io.ReadAll - 返回的是原始未压缩内容的
[]byte,可转为 string 或 JSON 解析 - 务必检查错误,尤其当文件损坏或非 gzip 格式时
从网络响应或任意 io.Reader 解压(如 HTTP body)
gzip 不限于文件,任何实现了 io.Reader 的源(如 http.Response.Body)都可解压:
- 若服务端返回
Content-Encoding: gzip,通常已由http.Client自动解压;如需手动控制,可禁用自动解压(设置Transport.DisableCompression = true),再用gzip.NewReader(resp.Body) - 传入的 reader 必须支持按需读取,不能是单次消费型(如某些加密 reader 需确认是否可重复读)










