golang 中可通过标准库实现 zip 文件的压缩与解压操作。1. 压缩文件时,使用 archive/zip 包创建 zip 输出文件,遍历源文件并逐个写入 zip 存档中,设置压缩方法为 deflate;2. 解压文件时,打开 zip 文件并遍历其条目,根据文件信息创建本地目录及文件,并将数据写入对应文件;3. 使用 compress/gzip 模块可对单个文件进行压缩或解压,通过 gzip.newwriter 或 gzip.newreader 实现数据流的处理。

在处理文件传输或存储时,压缩和解压是常见的需求。Golang 提供了标准库来支持多种压缩格式,比如 zip、gzip 等。通过这些标准库,我们可以很方便地实现文件的打包、压缩与解压操作。

下面介绍几个常见的使用场景和具体做法,帮助你快速上手 Golang 中的压缩与解压操作。

ZIP 是一种非常通用的压缩格式,适用于跨平台使用。Go 的 archive/zip 包提供了对 ZIP 格式的支持。
立即学习“go语言免费学习笔记(深入)”;
要实现一个简单的 ZIP 压缩功能,主要步骤包括:

示例代码如下:
func compressToZip(sourceFiles []string, targetZip string) error {
zipFile, err := os.Create(targetZip)
if err != nil {
return err
}
defer zipFile.Close()
zipWriter := zip.NewWriter(zipFile)
defer zipWriter.Close()
for _, filePath := range sourceFiles {
file, err := os.Open(filePath)
if err != nil {
return err
}
defer file.Close()
info, err := file.Stat()
if err != nil {
return err
}
header, _ := zip.FileInfoHeader(info)
header.Name = info.Name()
header.Method = zip.Deflate // 使用 Deflate 算法压缩
writer, err := zipWriter.CreateHeader(header)
if err != nil {
return err
}
_, err = io.Copy(writer, file)
if err != nil {
return err
}
}
return nil
}这个函数可以将多个文件压缩成一个 ZIP 包。注意这里我们手动设置了压缩方法为 Deflate,这是 ZIP 中常用的压缩方式。
有时候我们需要从 ZIP 文件中提取内容,这可以通过 archive/zip 包中的 ReadCloser 来实现。
基本流程如下:
核心逻辑可以这样写:
func extractZip(zipPath, destDir string) error {
r, err := zip.OpenReader(zipPath)
if err != nil {
return err
}
defer r.Close()
for _, f := range r.File {
path := filepath.Join(destDir, f.Name)
if f.FileInfo().IsDir() {
os.MkdirAll(path, os.ModePerm)
continue
}
if err := os.MkdirAll(filepath.Dir(path), os.ModePerm); err != nil {
return err
}
rc, err := f.Open()
if err != nil {
return err
}
defer rc.Close()
outFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
if err != nil {
return err
}
defer outFile.Close()
if _, err = io.Copy(outFile, rc); err != nil {
return err
}
}
return nil
}这段代码会把 ZIP 文件中的所有内容解压到指定路径下,保留原始目录结构。
如果你只是想压缩单个文件,而不是打包多个文件,那 compress/gzip 模块就派上用场了。
压缩过程大致如下:
.gz 文件gzip.NewWriter 写入压缩内容示例代码:
func compressWithGzip(src, dst string) error {
inFile, err := os.Open(src)
if err != nil {
return err
}
defer inFile.Close()
outFile, err := os.Create(dst)
if err != nil {
return err
}
defer outFile.Close()
gzWriter := gzip.NewWriter(outFile)
defer gzWriter.Close()
_, err = io.Copy(gzWriter, inFile)
return err
}解压则类似:
func decompressGzip(src, dst string) error {
inFile, err := os.Open(src)
if err != nil {
return err
}
defer inFile.Close()
gzReader, err := gzip.NewReader(inFile)
if err != nil {
return err
}
defer gzReader.Close()
outFile, err := os.Create(dst)
if err != nil {
return err
}
defer outFile.Close()
_, err = io.Copy(outFile, gzReader)
return err
}这种方式适合用于日志文件、配置文件等单个文本或二进制文件的压缩与解压。
基本上就这些。Golang 的标准库已经覆盖了常见压缩格式的基本使用,虽然没有像第三方库那样强大灵活,但应对日常任务完全够用。只要理解了接口的设计逻辑,实现起来也并不复杂,不过细节还是容易出错,比如路径处理、文件权限设置、关闭资源顺序等,都需要多加留意。
以上就是Golang如何实现文件压缩与解压 标准库压缩模块应用实例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号