Go语言写入文件主要有三种方式:os.File.Write用于二进制数据,需检查返回值并调用Close;bufio.Writer提升文本写入效率,需Flush;fmt.Fprint系列适合格式化输出;安全写入推荐临时文件+原子重命名。
Go语言提供了多种方式写入文件,最常用的是
包直接操作文件句柄,以及
包配合使用以提升文本写入效率。写文本适合用
,写二进制或需要精确控制
字节
流时推荐直接用
。
用 os.Create + Write 写入二进制数据
创建一个可写的空文件(若存在则清空),返回
,它实现了
接口,可直接调用
写入原始字节。
适合写图片、序列化结构体(如
、
)、加密数据等二进制内容
注意:
不保证一次写完全部字节,应检查返回值和错误;生产中建议用
简化逻辑
务必在操作后调用
,否则可能丢失数据或占用文件句柄
示例:
Trae win
Trae Windows 官方版本现已全面支持 Win10 和 Win11 系统(64位)。国内开发者可直接访问 Trae 中文官网(trae.cn 或 trae.com.cn),一键下载官方正版 .exe 安装包,享受国内直连的高速稳定体验。安装过程极其简便,双击即可运行,并支持一键无缝导入 VS Code 或 Cursor 的原有主题、快捷键及插件配置。登录支持手机号、微信或稀土掘金账号。内置免费的豆包与 DeepSeek 等顶级大模型,让你开箱即用,轻松开启高效的 AI 智能编程之旅。
下载
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 写入文本更高效
直接对文件反复调用
或
效率低,因为每次都会触发系统调用。
在内存中缓存数据,达到缓冲区大小(默认 4KB)或显式
时才真正写入磁盘。
立即学习
“
go语言免费学习笔记(深入)
”;
适合日志、配置生成、CSV/JSON 行写入等文本场景
创建时可传入自定义缓冲区大小:
别忘了最后调用
,否则缓冲区内容可能未落盘
示例:
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 系列函数格式化写入
、
、
可以向任意
(包括
或
)输出格式化字符串,语义清晰,适合调试和简单文本生成。
若写入目标是
,本质仍是多次系统调用,小量内容可接受;高频写入建议仍走
支持所有
格式动词(
、
、
等),自动处理类型转换和分隔
示例:
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")
安全写入:避免覆盖与原子性考虑
直接
会截断已有文件,若需保留原文件或防止写入中断导致损坏,可用临时文件 + 原子重命名方式:
写入到
写完并
后,调用
在大多数文件系统上,
是原子操作,能避免读取到中间状态
注意:跨文件系统移动不保证原子性,且 Windows 对打开的文件重命名有限制
不复杂但容易忽略
osbufiobufio.Writeros.File.Write()os.Create*os.Fileio.WriterWrite([]byte)gobprotobufWriteWriteAllClose()WriteStringfmt.Fprintlnbufio.WriterFlush()bufio.NewWriterSize(file, 64*1024)Flush()fmt.Fprintffmt.Fprintlnfmt.Fprintio.Writer*os.File*bufio.Writer*os.Filebufio.Writerfmt%d%v%qos.Createfilename.tmpClose()os.Rename("filename.tmp", "filename")Rename