新闻中心
如何用Golang实现文件压缩与解压_Golang 文件压缩解压实践
Go语言通过archive/zip和compress/gzip包支持文件压缩解压,ZIP适用于多文件打包保留结构,GZIP适合单个文件高压缩比场景,结合实际需求选择格式并正确管理资源释放即可高效实现压缩功能。

在Go语言开发中,处理文件压缩与解压是常见的需求,比如日志归档、配置打包或网络传输优化。Golang标准库提供了强大的支持,尤其是archive/zip和compress/gzip包,能够满足大多数场景下的压缩与解压操作。
Golang 中常用的压缩方式
常见的文件压缩格式有 ZIP 和 GZIP。它们用途不同:
- ZIP:适合多个文件打包压缩,保留文件结构,常用于归档
- GZIP:通常用于单个文件压缩,不支持多文件,但压缩率高,常配合HTTP传输使用
使用 zip 实现多文件压缩与解压
Go 的 archive/zip 包可以方便地创建和读取 ZIP 压缩包。
以下代码将指定目录下的所有文件打包成一个 ZIP 文件:
package main
import (
"archive/zip"
"io"
"os"
"path/filepath"
)
func compressToZip(sourceDir, zipFile string) error {
f, err := os.Create(zipFile)
if err != nil {
return err
}
defer f.Close()
zipWriter := zip.NewWriter(f)
defer zipWriter.Close()
filepath.Walk(sourceDir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
// 跳过目录本身
if path == sourceDir {
return nil
}
// 创建文件头
header, _ := zip.FileInfoHeader(info)
header.Name = path[len(sourceDir)+1:] // 相对路径
if info.IsDir() {
header.Name += "/"
zipWriter.CreateHeader(header)
return nil
}
writer, err := zipWriter.CreateHeader(header)
if err != nil {
return err
}
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(writer, file)
return err
})
return nil
}
从 ZIP 文件解压内容
下面是从 ZIP 包中解压所有文件到目标目录的实现:
Whimsical
Whimsical推出的AI思维导图工具
182
查看详情
func decompressFromZip(zipFile, destDir string) error {
reader, err := zip.OpenReader(zipFile)
if err != nil {
return err
}
defer reader.Close()
for _, file := range reader.File {
filePath := filepath.Join(destDir, file.Name)
if file.FileInfo().IsDir() {
os.MkdirAll(filePath, os.ModePerm)
continue
}
if err := os.MkdirAll(filepath.Dir(
filePath), os.ModePerm); err != nil {
return err
}
f, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode())
if err != nil {
return err
}
rc, err := file.Open()
if err != nil {
f.Close()
return err
}
_, err = io.Copy(f, rc)
rc.Close()
f.Close()
if err != nil {
return err
}
}
return nil
}
使用 gzip 压缩单个文件
GZIP 更适合单个大文件的压缩,例如日志文件。
压缩文件(gzip)将一个普通文件压缩为 .gz 格式:
import (
"compress/gzip"
"os"
)
func compressWithGzip(source, gzFile string) error {
inFile, err := os.Open(source)
if err != nil {
return err
}
defer inFile.Close()
outFile, err := os.Create(gzFile)
if err != nil {
return err
}
defer outFile.Close()
gzWriter := gzip.NewWriter(outFile)
defer gzWriter.Close()
_, err = io.Copy(gzWriter, inFile)
return err
}
解压 GZIP 文件
将 .gz 文件还原为原始内容:
func decompressGzip(gzFile, target string) error {
gzFileReader, err := os.Open(gzFile)
if err != nil {
return err
}
defer gzFileReader.Close()
gzReader, err := gzip.NewReader(gzFileReader)
if err != nil {
return err
}
defer gzReader.Close()
outFile, err := os.Create(target)
if err != nil {
return err
}
defer outFile.Close()
_, err = io.Copy(outFile, gzReader)
return err
}
实际使用建议
- 对于需要保留目录结构的批量文件,优先选择 ZIP
- 传输或存储单个大文本文件时,GZIP 效率更高
- 注意设置合理的文件权限(如
os.ModePerm) - 压缩过程中及时关闭资源,避免句柄泄露
- 大文件处理时可考虑分块读写,降低内存占用
基本上就这些。Golang 的标准库已经足够应对大多数压缩需求,无需引入第三方依赖。掌握 zip 和 gzip 的基本用法后,可以轻松集成到日志系统、API 响应、配置导出等模块中。关键在于理解每种格式的适用场景,并正确管理文件流和资源释放。
以上就是如何用Golang实现文件压缩与解压_Golang 文件压缩解压实践的详细内容,更多请关注其它相关文章!
# 句柄
# 滁州定制网站建设价格
# 抖音营销推广意图怎么做
# 建设网站怎么提需求
# 推广全网营销资源
# 淮北市场营销推广招商
# 网站优化推广哪里好
# 专业市场营销推广服务
# 南宁公司有网站建设吗
# seo如何选择培训机构
# 太仓网站排名优化
# 相关文章
# 是从
# 适用于
# go
# 尤其是
# 大文件
# 多个
# 如何用
# 压缩解压
# 标准库
# 内存占用
# 文件压缩
# 解压
# ai
# go语言
# golang
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】
Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南
解决Python单元测试中Mock异常方法调用计数为零的问题
服务端验证_j*ascript输入检查
夸克AO3官网入口_AO3镜像网站2025推荐
sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤
Go语言HTML解析:利用Goquery精准获取指定元素内容
MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId
58动漫网在线官方网 58动漫网正版动漫入口网址
Angular Material 垂直步进器:实现底部到顶部排序的教程
圆通快递查询实时追踪 圆通物流包裹状态快速查看
Django模型中自动计算可用余额的实现方法
HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解
从OpenAI API响应中高效提取生成文本
C#使用XPath查询节点时出错? 常见语法错误与调试技巧
多闪网页版在线观看免费入口_多闪官网访问入口
高德地图沿途添加点失败如何解决 高德多点规划方法
邮政快递包裹最新位置 邮政快递实时追踪入口
Angular中单选按钮的正确使用与常见陷阱解析
一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化
J*aScript Promise链中如何正确终止后续.then执行并处理错误
C++如何比较两个字符串_C++ string compare函数与操作符对比
Python实现多节点属性重叠度分析教程
J*aScript打印功能_j*ascript输出控制
机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等
Golang如何使用new_Go new分配内存机制讲解
C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用
Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法
Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践
Python异步编程实践:使用Binance API构建实时交易数据流
Node.js中HTML按钮与J*aScript函数交互的正确姿势
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
Go语言中JSON数据解析与字段访问教程
Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度
腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址
mysql密码锁定怎么解锁_mysql密码锁定解锁后修改密码步骤
QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用
Tailwind CSS line-clamp 布局问题解析与修复指南
c++ 获取系统当前时间 c++时间戳获取方法
12306选座系统怎么选连座_12306选座多人连坐操作方法
深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射
自定义Bag-of-Words实现:处理带负号的词汇权重
漫蛙漫画网页端入口 漫蛙2官方正版漫画站点
qq音乐在线播放入口_qq音乐电脑版登录链接
PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程
Typer应用中灵活处理命令行参数的令牌化与解析
印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】
TikTok评论显示延迟如何处理 TikTok评论刷新优化方法
在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略
汽水音乐在线版入口_汽水音乐网页播放手册


2025-11-18
浏览次数:次
返回列表
filePath), os.ModePerm); err != nil {
return err
}
f, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode())
if err != nil {
return err
}
rc, err := file.Open()
if err != nil {
f.Close()
return err
}
_, err = io.Copy(f, rc)
rc.Close()
f.Close()
if err != nil {
return err
}
}
return nil
}