使用 bufio.Writer 可显著提升 Go 文件写入性能,它通过缓冲减少系统调用;需显式调用 Flush() 确保数据落盘并检查错误,defer w.Flush() 仅在函数返回时执行,实时日志等场景需主动 Flush。

在 Go 中直接对文件频繁调用 Write 会导致大量系统调用,显著拖慢性能。使用 bufio.Writer 是最常用、最有效的缓冲写入方案——它把多次小写入攒成一次大写入,大幅减少 I/O 开销。
创建带缓冲的 Writer
用 os.Create 或 os.OpenFile 获取文件句柄后,将其传给 bufio.NewWriter 或 bufio.NewWriterSize:
-
bufio.NewWriter(f)使用默认缓冲区(通常 4KB) -
bufio.NewWriterSize(f, 64*1024)可自定义大小(如 64KB),适合批量写入大日志或数据流
写入内容与刷新缓冲区
调用 w.Write()、w.WriteString()、w.Fprintf() 等方法时,数据先写入内存缓冲区,并不立即落盘:
- 必须显式调用
w.Flush()才会将缓冲区内容真正写入文件 - 程序退出前未
Flush,数据可能丢失(尤其 panic 或 os.Exit 时) - 推荐用
defer w.Flush(),但注意:它只在函数返回时执行,若函数中提前 return 且有未 flush 内容,仍可能遗漏
错误处理不能只看 Write,要看 Flush
Write 方法几乎总返回 nil 错误(除非缓冲区满且底层写失败),真正写磁盘失败发生在 Flush 时:
立即学习“go语言免费学习笔记(深入)”;
- 每次
Flush()后都应检查错误:if err := w.Flush(); err != nil { /* 处理 */ } - 如果写入过程中发生磁盘满、权限不足等问题,
Flush会首次暴露该错误 - 忽略
Flush错误,等于忽略写入是否成功
何时手动 Flush?
多数场景依赖结尾一次 Flush 即可,但以下情况需主动触发:
- 实时日志:每条日志后
Flush()保证立即可见(但会牺牲性能,慎用) - 写入中途需确保部分内容已落盘(如关键状态标记)
- 缓冲区接近满时,提前
Flush()避免后续Write阻塞










