如何使用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) 写入原始字节。

  • 适合写图片、序列化结构体(如 gobprotobuf)、加密数据等二进制内容
  • 注意: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 写入文本更高效

直接对文件反复调用 WriteStringfmt.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.Fprintffmt.Fprintlnfmt.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中间件编写与应用流程