Go语言compress/gzip包可高效压缩文件,核心步骤为打开源文件、创建gzip写入器、流式复制内容并关闭资源;支持调节压缩级别(1–9)和设置文件名、修改时间等元数据。

Go语言内置的compress/gzip包可以高效地对文件进行gzip压缩,显著减小体积,适合日志归档、备份传输或长期存储场景。关键在于正确创建gzip writer、处理I/O流,并注意错误和资源释放。
压缩单个文件的基本流程
核心步骤:打开源文件 → 创建gzip写入器 → 读取并写入压缩流 → 关闭资源。
- 使用
os.Open读取原始文件,用os.Create创建目标.gz文件 - 通过
gzip.NewWriter包装输出文件句柄,所有写入都会自动压缩 - 用
io.Copy将源文件内容流式复制到gzip writer,避免内存全载 -
必须调用
gzWriter.Close()——它会刷新缓冲区并写入gzip尾部信息,否则解压会失败
控制压缩级别提升效率
默认使用gzip.DefaultCompression(等级6),但可根据需求调整:
- 速度优先:用
gzip.BestSpeed(等级1),适合频繁压缩的实时日志 - 空间优先:用
gzip.BestCompression(等级9),适合归档冷数据 - 自定义等级:传入
gzip.NewWriterLevel(file, level),level范围是1–9
保留原始文件名和修改时间(可选)
标准gzip不保存这些元数据,但可通过设置Header增强兼容性:
立即学习“go语言免费学习笔记(深入)”;
- 创建writer后,设置
w.Header.Name = "original.txt"(最多1024字节) - 设置
w.Header.ModTime = originalFileInfo.ModTime(),解压工具如gunzip -l可显示原时间 - 注意:
Name字段仅作提示,不影响解压行为
完整示例代码
(含错误处理和资源清理)
func gzipFile(src, dst string) error {
srcFile, err := os.Open(src)
if err != nil {
return err
}
defer srcFile.Close()
dstFile, err := os.Create(dst)
if err != nil {
return err
}
defer dstFile.Close()
gzWriter := gzip.NewWriter(dstFile)
defer gzWriter.Close() // 关键:确保尾部写入
_, err = io.Copy(gzWriter, srcFile)
return err
}










