如何使用Golang写入文件数据_通过os和bufio写入文本和二进制
发布时间:2025-12-31 00:00
发布者:P粉602998670
浏览次数:Go语言写入文件主要有三种方式:os.File.Write用于二进制数据,需检查返回值并调用Close;bufio.Writer提升文本写入效率,需Flush;fmt.Fprint系列适合格式化输出;安全写入推荐临时文件+原子重命名。
Go语言提供了多种方式写入文件,最常用的是 os 包直接操作文件句柄,以及 bufio 包配合使用以提升文本写入效率。写文本适合用 bufio.Writer,写二进制或需要精确控制字节流时推荐直接用 os.File.Write()。
用 os.Create + Write 写入二进制数据
os.Create 创建一个可写的空文件(若存在则清空),返回 *os.File,它实现了 io.Writer 接口,可直接调用 Write([]byte) 写入原始字节。
- 适合写图片、序列化结构体(如
gob、protobuf)、加密数据等二进制内容 - 注意:
Write不保证一次写完全部字节,应检查返回值和错误;生产中建议用WriteAll简化逻辑 - 务必在操作后调用
Close(),否则可能丢失数据或占用文件句柄
示例:
file, err := os.Create("data.bin")if err != nil {
log.Fatal(err)
}
defer file.Close()
// 写入字节切片
_, err = file.Write([]byte{0x01, 0x02, 0xFF})
if err !=
nil {log.Fatal(err)
}
用 bufio.Writer 写入文本更高效
直接对文件反复调用 WriteString 或 fmt.Fprintln 效率低,因为每次都会触发系统调用。bufio.Writer 在内存中缓存数据,达到缓冲区大小(默认 4KB)或显式 Flush() 时才真正写入磁盘。
- 适合日志、配置生成、CSV/JSON 行写入等文本场景
- 创建时可传入自定义缓冲区大小:
bufio.NewWriterSize(file, 64*1024) - 别忘了最后调用
Flush(),否则缓冲区内容可能未落盘
示例:
file, _ := os.Create("output.txt")defer file.Close()
wr := bufio.NewWriter(file)
defer wr.Flush() // 确保缓冲区写出
wr.WriteString("Hello, ")
wr.WriteString("World!\n")
wr.WriteString("Line 3\n")
用 fmt.Fprint 系列函数格式化写入
fmt.Fprintf、fmt.Fprintln、fmt.Fprint 可以向任意 io.Writer(包括 *os.File 或 *bufio.Writer)输出格式化字符串,语义清晰,适合调试和简单文本生成。
- 若写入目标是
*os.File,本质仍是多次系统调用,小量内容可接受;高频写入建议仍走bufio.Writer - 支持所有
fmt格式动词(%d、%v、%q等),自动处理类型转换和分隔
示例:
file, _ := os.Create("log.txt")defer file.Close()
fmt.Fprintln(file, "Start at:", time.Now())
fmt.Fprintf(file, "Count: %d, Status: %s\n", 42, "ok")
安全写入:避免覆盖与原子性考虑
直接 os.Create 会截断已有文件,若需保留原文件或防止写入中断导致损坏,可用临时文件 + 原子重命名方式:
- 写入到
filename.tmp - 写完并
Close()后,调用os.Rename("filename.tmp", "filename") - 在大多数文件系统上,
Rename是原子操作,能避免读取到中间状态 - 注意:跨文件系统移动不保证原子性,且 Windows 对打开的文件重命名有限制
不复杂但容易忽略
# js
# json
# go
# windows
# golang
# go语言
# 字节
# csv
# win
# 格式化输出
# if
# count
# 字符串
# 结构体
# 接口
相关文章:
css文件太多影响性能怎么办_合并css文件减少http请求
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
java内置函数式接口有哪些?
sublime怎么快速调整选中文本大小写_sublime转换大写小写快捷键【技巧】
火狐浏览器网页入口极速安全浏览体验
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
pdf转word如何保留原格式?亲测这3种方法最靠谱!
熊猫办公怎么查看历史下载记录 熊猫办公已下载文件找回【路径】
智谱发布 2025 年开源报告
html5 plus怎么调用_HTML5 Plus在HBuilder中调用扫码拍照等原生API【调用】
Java 中实现智能金额单位(k/M/B)的简洁封装方案
为什么本地php环境访问慢_php本地服务器性能优化方法【说明】
Linux服务性能分析教程_topVmstatIostat综合指标解析
搜搜小说入口网页版_搜搜小说官方网页版登录免费阅读网站
《给他爱5》麦克演员屡被报假警 甚至与警察成了朋友
PHP怎么接收前端传的布尔值_处理truefalse参数转换方法指南【解答】
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
海尔专卖店深化数字转型实现80%统仓ToC
通义千问怎样写文案_通义千问文案写作教程【指南】
Django 的 SECRET_KEY 更改后项目仍正常运行的原因解析
javascript测试怎么写_Jest和Mocha测试框架该怎么选?
如何修复伪元素 :before 导致按钮失去圆角的问题
html如何部署_将HTML项目部署到服务器的步骤【步骤】
死亡呼啸测评:运气干扰导致战棋和卡牌爽感全无
如何在单个HTML文件中嵌入CSS样式
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
罗永浩创业公司细红线发布 AI 讲书产品“且听”
怎样使用JSON进行数据交换_它有什么限制
c++ Hot/Cold Splitting是什么 c++代码布局优化【性能】
相关栏目:
【
行业资讯17850 】
【
软件资源51899 】
【
网站技术89748 】
【
百度推广44206 】
【
网络营销84187 】
【
运营推广93002 】
【
AI优化91086 】
【
网络优化117696 】
【
网址导航107142 】






