通八洲科技

如何在Golang中解压文件_Golang compress/gzip解压操作方法

日期:2026-01-01 00:00 / 作者:P粉602998670
gzip.Reader读取压缩流时必须显式检查io.EOF,因它不会自动返回;推荐用io.Copy解压,若需逐块读则每次检查n和err;解压tar.gz需正确嵌套gzip.NewReader与tar.NewReader,并严格按Header.Size读取。

gzip.Reader 读取压缩流时必须检查 io.EOF

Go 的 gzip.Reader 不会在读完所有数据后自动返回 io.EOF,而是可能在解压末尾仍返回 nil 错误、但后续再读一次才触发 io.EOF。不显式处理会导致循环卡死或漏数据。

解压单个 .gz 文件到磁盘的最小可靠写法

注意文件路径、权限和错误传播。Go 标准库不会自动创建父目录,也不会覆盖只读文件。

func gunzipFile(src, dst string) error {
	f, err := os.Open(src)
	if err != nil {
		return err
	}
	defer f.Close()

	gr, err := gzip.NewReader(f)
	if err != nil {
		return err
	}
	defer gr.Close()

	out, err := os.Create(dst)
	if err != nil {
		return err
	}
	defer out.Close()

	_, err = io.Copy(out, gr)
	return err
}

解压 tar.gz 时别直接用 gzip.NewReader 套 tar.NewReader

tar.gz 是两层封装:外层 gzip、内层 tar。常见错误是先解压整个流到内存再解析 tar,或漏掉 tar.Header.Size 导致读取错位。

gzip.Reader 初始化失败的典型错误信息

遇到这些提示,基本可定位为输入源问题:

解压逻辑本身不复杂,真正容易出问题的是边界条件:空文件、损坏流、路径注入、权限继承、多层嵌套(如 tar.gz 内含 symlinks)。别省略 Close()、别跳过 Stat() 检查、别信输入源一定合规。