如何使用Golang写入文件数据_通过os和bufio写入文本和二进制
发布时间 - 2025-12-31 00:00:00 点击率:次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
# 字符串
# 结构体
# 接口
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何用美橙互联一键搭建多站合一网站?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
如何在腾讯云服务器上快速搭建个人网站?
敲碗10年!Mac系列传将迎来「触控与联网」双革新
如何在万网ECS上快速搭建专属网站?
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
如何解决hover在ie6中的兼容性问题
Laravel API资源类怎么用_Laravel API Resource数据转换
JS去除重复并统计数量的实现方法
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
iOS正则表达式验证手机号、邮箱、身份证号等
bootstrap日历插件datetimepicker使用方法
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
太平洋网站制作公司,网络用语太平洋是什么意思?
如何用AI帮你把自己的生活经历写成一个有趣的故事?
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
JavaScript如何实现倒计时_时间函数如何精确控制
Laravel Session怎么存储_Laravel Session驱动配置详解
iOS中将个别页面强制横屏其他页面竖屏
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
javascript中的try catch异常捕获机制用法分析
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
PHP正则匹配日期和时间(时间戳转换)的实例代码
详解vue.js组件化开发实践
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
js代码实现下拉菜单【推荐】
网站制作壁纸教程视频,电脑壁纸网站?
微信小程序 wx.uploadFile无法上传解决办法
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
高性价比服务器租赁——企业级配置与24小时运维服务
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
Laravel如何使用Collections进行数据处理?(实用方法示例)
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程

