在Golang的标准库中,compress/gzip包提供了对gzip格式压缩的支持,开发者可以直接使用该包实现文件的压缩功能,无需引入第三方依赖,操作起来也比较简单。下面会逐步讲解不同场景下的文件压缩实现方式。

单个文件gzip压缩实现
单个文件压缩是最基础的使用场景,核心流程是打开源文件、创建目标压缩文件、初始化gzip写入器,然后将源文件内容拷贝到gzip写入器中即可。具体实现代码如下:
package main
import (
"compress/gzip"
"fmt"
"io"
"os"
)
// 压缩单个文件
func compressSingleFile(srcPath string, destPath string) error {
// 打开源文件
srcFile, err := os.Open(srcPath)
if err != nil {
return fmt.Errorf("打开源文件失败: %v", err)
}
defer srcFile.Close()
// 创建目标压缩文件
destFile, err := os.Create(destPath)
if err != nil {
return fmt.Errorf("创建目标文件失败: %v", err)
}
defer destFile.Close()
// 初始化gzip写入器
gzipWriter := gzip.NewWriter(destFile)
defer gzipWriter.Close()
// 将源文件内容拷贝到gzip写入器
_, err = io.Copy(gzipWriter, srcFile)
if err != nil {
return fmt.Errorf("拷贝文件内容失败: %v", err)
}
return nil
}
func main() {
err := compressSingleFile("./test.txt", "./test.txt.gz")
if err != nil {
fmt.Println("压缩失败:", err)
return
}
fmt.Println("单个文件压缩成功")
}
多个文件批量压缩实现
如果需要批量压缩多个文件,核心思路是遍历文件列表,逐个将文件内容写入到同一个gzip写入器中,注意每个文件写入前可以添加文件名标识,方便后续解压时区分。实现代码如下:
package main
import (
"compress/gzip"
"fmt"
"io"
"os"
"path/filepath"
)
// 批量压缩多个文件
func compressMultiFile(fileList []string, destPath string) error {
// 创建目标压缩文件
destFile, err := os.Create(destPath)
if err != nil {
return fmt.Errorf("创建目标文件失败: %v", err)
}
defer destFile.Close()
// 初始化gzip写入器
gzipWriter := gzip.NewWriter(destFile)
defer gzipWriter.Close()
// 遍历文件列表逐个压缩
for _, filePath := range fileList {
// 打开当前待压缩文件
srcFile, err := os.Open(filePath)
if err != nil {
return fmt.Errorf("打开文件%s失败: %v", filePath, err)
}
// 写入文件名作为标识
fileName := filepath.Base(filePath)
_, err = gzipWriter.Write([]byte(fileName + "n"))
if err != nil {
srcFile.Close()
return fmt.Errorf("写入文件名标识失败: %v", err)
}
// 拷贝文件内容
_, err = io.Copy(gzipWriter, srcFile)
srcFile.Close()
if err != nil {
return fmt.Errorf("拷贝文件%s内容失败: %v", filePath, err)
}
}
return nil
}
func main() {
files := []string{"./a.txt", "./b.txt", "./c.txt"}
err := compressMultiFile(files, "./multi_files.gz")
if err != nil {
fmt.Println("批量压缩失败:", err)
return
}
fmt.Println("多个文件批量压缩成功")
}
压缩相关注意事项
在使用compress/gzip包进行文件压缩时,有几个点需要特别注意:
- 使用
gzip.NewWriter创建写入器后,一定要记得调用Close方法,否则压缩数据可能没有完全写入文件,导致压缩文件损坏。 - 如果需要调整压缩率,可以使用
gzip.NewWriterLevel方法,第一个参数是写入目标,第二个参数是压缩等级,取值范围是-2到9,其中-2表示最快压缩,9表示最优压缩,默认等级是6。 - 操作文件时要注意处理权限问题,确保程序对源文件有读取权限,对目标路径有写入权限,避免出现权限不足的错误。
- 压缩大文件时,io.Copy方法会分块读取内容,不会一次性将整个文件加载到内存中,所以不用担心内存溢出的问题。
常见问题解答
压缩后的文件无法解压怎么办
首先检查是否在压缩完成后正确关闭了gzip写入器,其次检查源文件是否存在且可读,最后可以查看压缩过程中是否有错误返回,根据错误信息排查问题。
如何压缩整个目录
压缩整个目录需要先遍历目录下的所有文件,获取所有文件的路径列表,再调用批量压缩的方法即可,遍历目录可以使用filepath.Walk函数实现。
Golangcompress/gzip文件压缩gzip压缩修改时间:2026-06-12 16:45:33