在Go语言开发中,archive/zip标准库能够帮助我们完成ZIP格式的压缩与解压工作。它位于标准库内,使用起来稳定且无需额外安装依赖,非常适合在服务端进行文件打包和传输。

创建ZIP压缩包
创建ZIP包主要使用zip.Writer。我们可以先建一个输出文件,再基于它构造Writer,然后逐个写入文件内容。下面的示例演示了如何将指定的一些文件压缩到一个ZIP里。
package main
import (
"archive/zip"
"io"
"os"
)
func main() {
// 创建目标ZIP文件
outFile, err := os.Create("output.zip")
if err != nil {
panic(err)
}
defer outFile.Close()
// 构造zip.Writer
zw := zip.NewWriter(outFile)
defer zw.Close()
// 要压缩的源文件列表
files := []string{"a.txt", "b.txt"}
for _, name := range files {
// 在ZIP内创建文件头
w, err := zw.Create(name)
if err != nil {
panic(err)
}
// 读取源文件并写入ZIP
src, err := os.Open(name)
if err != nil {
panic(err)
}
io.Copy(w, src)
src.Close()
}
}
解压ZIP包
解压时使用zip.Reader或zip.OpenReader。通过遍历包内的文件对象,可以把每个文件还原到本地目录。下面代码展示了解压过程。
package main
import (
"archive/zip"
"io"
"os"
"path/filepath"
)
func main() {
// 打开ZIP包
r, err := zip.OpenReader("output.zip")
if err != nil {
panic(err)
}
defer r.Close()
// 遍历内部文件
for _, f := range r.File {
// 拼接目标路径
dest := filepath.Join("unzip_dir", f.Name)
if f.FileInfo().IsDir() {
os.MkdirAll(dest, 0755)
continue
}
// 创建目标文件
out, err := os.Create(dest)
if err != nil {
panic(err)
}
rc, err := f.Open()
if err != nil {
panic(err)
}
io.Copy(out, rc)
out.Close()
rc.Close()
}
}
注意事项
- 写入ZIP时记得及时关闭Writer,否则可能数据未刷新到磁盘。
- 解压时应注意文件名路径,避免解压到预期之外的目录。
- 如果需设置压缩级别,可使用zw.CreateHeader并自定义zip.FileHeader。
常用方法小结
| 操作 | 主要类型或函数 | 说明 |
|---|---|---|
| 压缩 | zip.Writer | 将文件写入ZIP包 |
| 解压 | zip.Reader | 读取ZIP内文件内容 |
| 创建项 | Create或CreateHeader | 在包内新建文件条目 |
通过上述方式,我们可以在Golang中方便地使用archive/zip来完成文件的创建与解压。实际项目中,可以结合文件路径遍历实现整个目录的打包与还原。
Golangarchive/zipZIP压缩ZIP解压文件打包修改时间:2026-07-25 00:45:18