使用compress/gzip包可实现Go语言文件压缩,需打开源文件并创建.gz目标文件,通过gzip.NewWriter包装写入器,将源内容拷贝至写入器,并调用Close()确保尾部信息写入。

在Go语言中,使用 compress/gzip 包可以轻松实现文件的GZIP压缩。这个包通常与 os 和 bufio 等标准库配合使用,完成从读取原始文件到生成压缩文件的流程。
1. 基本流程说明
要压缩一个文件,主要步骤如下:
- 打开需要压缩的源文件
- 创建一个以 .gz 结尾的目标文件
- 用 gzip.NewWriter 将目标文件包装成GZIP写入器
- 将源文件内容拷贝到GZIP写入器中
- 关闭GZIP写入器(必须调用 Close() 来写入尾部校验)
2. 实现文件压缩的完整代码示例
package main
import (
"bufio"
"compress/gzip"
"io"
"os"
)
func compressFile(src, dst string) error {
// 打开源文件
inputFile, err := os.Open(src)
if err != nil {
return err
}
defer inputFile.Close()
// 创建目标 .gz 文件
outputFile, err := os.Create(dst)
if err != nil {
return err
}
defer outputFile.Close()
// 使用 bufio 提升I/O性能
writer := bufio.NewWriter(outputFile)
defer writer.Flush()
// 构建gzip写入器
gzWriter := gzip.NewWriter(writer)
defer gzWriter.Close()
// 将源文件内容拷贝到gzip写入器
_, err = io.Copy(gzWriter, inputFile)
return err
}
func main() {
err := compressFile("example.txt", "example.txt.gz")
if err != nil {
panic(err)
}
println("文件压缩完成")
}
3. 关键注意事项
使用 compress/gzip 时有几个关键点需要注意:
- 必须调用 gzWriter.Close():这一步会写入GZIP尾部的CRC和长度信息,如果跳过会导致压缩文件损坏
- 建议使用 bufio.Writer 提高写入效率,减少系统调用次数
- 文件扩展名通常为 .gz,但不是强制要求
- gzip压缩的是单个文件,不支持目录打包(如需打包多文件应结合 tar 使用)
4. 可选:设置压缩级别
gzip.NewWriterLevel 可以指定压缩等级,例如:
立即学习“go语言免费学习笔记(深入)”;
gzWriter, err := gzip.NewWriterLevel(writer, gzip.BestCompression)
if err != nil {
return err
}
可用等级包括:
- gzip.BestSpeed(最快)
- gzip.BestCompression(最高压缩比)
- gzip.DefaultCompression(默认)
- 0-9 的整数(0=不压缩,9=最高压缩)










