首页 关于我们 成功案例 网络营销 电商设计 新闻中心 联系方式
QQ联系
电话联系
手机联系
QQ联系
电话联系
手机联系

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

  • 适合写图片、序列化结构体(如 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  # 字符串  # 结构体  # 接口 


相关文章: 《星露谷物语》作者向C#框架捐12.5万美元!承诺每月资助  Safari浏览器网页排版错乱怎么办 Safari页面修复  如何在 React 中使用 AG Grid 实现行列转置(Transpose)  手机号登录学习通网页入口_超星官方平台快速访问  收租管理系统哪家好?适用保障房、出租房、长租公寓、二房东  sublime怎么快速调整选中文本大小写_sublime转换大写小写快捷键【技巧】  css定位和flex区别_css多种布局方式如何选择  如何在Golang中优化模块结构_减少依赖和模块复杂度  传荣耀Magic8 mini线下盲订已开启 天玑9500加持?  ppt官方备份恢复入口 ppt云端数据一键还原  JavaScript如何实现路由切换_JavaScript单页面应用路由原理是什么  Java依赖倒置原则如何应用_OOP架构设计逻辑讲解  谷歌网页版入口怎么进_Google搜索引擎网页版首页入口地址  淘宝闪购入口在哪找?淘宝闪购官方限时抢购频道一键直达  Python图片处理进阶教程_Pillow滤镜与图像增强  如何实现流畅无抖动的 Marquee 滚动动画  《巫师3》次世代新模组发布 致力还原2013年E3演示版光照效果  JavaScript如何实现单例模式_怎样确保全局只有一个实例  C++如何获取当前系统时间?(代码示例)  解决 Telegram Web View 在 iOS 上软键盘遮挡输入框的问题  2026年首款万元机皇来了!三星Galaxy S26 Ultra机模上手  死亡呼啸测评:运气干扰导致战棋和卡牌爽感全无  品质铸就信赖!小熊电器获评“2025中国制造·消费者信赖品牌”  铁路12306app抢票功能怎么用_12306如何自动抢票设置指南说明  LinuxWeb服务日志分析教程_ApacheNginx日志可视化实践  Win11怎么设置默认视频播放器_Windows 11关联媒体文件打开方式【步骤】  Linux网络故障排查流程_常见问题定位思路总结【技巧】  mac怎么右键_MAC鼠标右键设置与触控板手势技巧【入门】  c++运算符重载是什么 如何为自定义类重载加号运算符【教程】  如何使用Golang实现并发事件处理_Golang事件分发与处理示例 


相关栏目: 【 行业资讯17850 】 【 软件资源51899 】 【 网站技术89748 】 【 百度推广44206 】 【 网络营销84187 】 【 运营推广93002 】 【 AI优化91086 】 【 网络优化117696 】 【 网址导航107142