使用 bufio.Writer 可显著提升 Go 文件写入性能,它通过缓冲减少系统调用;需显式调用 Flush() 确保数据落盘并检查错误,defer w.Flush() 仅在函数返回时执行,实时日志等场景需主动 Flush。
在 Go 中直接对文件频繁调用 Write 会导致大量系统调用,显著拖慢性能。使用 bufio.Writer 是最常用、最有效的缓冲写入方案——它把多次小写入攒成一次大写入,大幅减少 I/O 开销。
用 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 方法几乎总返回 nil 错误(除非缓冲区满且底层写失败),真正写磁盘失败发生在 Flush 时:
Flush() 后都应检查错误:if err := w.Flush(); err != nil { /* 处理 */ }
Flush 会首次暴露该错误Flush 错误,等于忽略写入是否成功多数场景依赖结尾一次 Flush 即可,但以下情况需主动触发:
Flush() 保证立即可见(但会牺牲性能,慎用)
Flush() 避免后续 Write 阻塞