os.ReadFile 和 os.WriteFile 适合小文件场景,如读取配置文件、写入临时 token 或小段日志;它们封装了打开、读/写、关闭全过程,安全便捷,但会全量加载内存,不适用于大文件。

小文件直接用 os.ReadFile 和 os.WriteFile,够用、安全、不用操心关文件;大文件或需要逐行处理时,必须用 os.Open + bufio.Scanner 流式读取,否则容易内存爆掉。
os.ReadFile 和 os.WriteFile 适合什么场景
这两个函数是 Go 1.16+ 官方推荐的“默认起点”,封装了打开、读/写、关闭全过程,省去手动管理文件句柄的麻烦。
- 读取配置文件(如
config.json)、写入临时 token、保存小段日志快照——直接上os.ReadFile/os.WriteFile就行 -
os.ReadFile返回[]byte,不是string;若确定是 UTF-8 文本,得自己转:string(data) -
os.WriteFile第三个参数是权限perm,Linux/macOS 下有效(比如0644),Windows 基本忽略;传0会导致文件不可读,别这么干 - 它总是覆盖写入,没法追加——要追加内容,必须换
os.OpenFile+O_APPEND
大文件必须用 bufio.Scanner 流式读取
几十 MB 以上的日志、CSV 或文本,os.ReadFile 会一次性全塞进内存,轻则卡顿,重则触发 runtime: out of memory。
- 正确做法:先
os.Open得到*os.File,再传给bufio.NewScanner -
scanner.Text()返回每行的拷贝,scanner.Bytes()返回底层切片引用(改它会影响下一次Scan()) - 默认单行上限 64KB,超长行会报
scanner.ErrTooLong;可通过scanner.Buffer(make([]byte, 64*1024), 1 调大缓冲区和最大行长 - 别在循环里反复调用
os.ReadFile处理多文件——每次都是全量加载,I/O 和内存开销双爆炸
追加写入和自定义打开模式要用 os.OpenFile
os.WriteFile 不支持追加,想往文件末尾加内容,唯一可靠方式是 os.OpenFile 配合 O_APPEND 标志。
立即学习“go语言免费学习笔记(深入)”;
- 常见组合:
os.O_WRONLY | os.O_CREATE | os.O_APPEND(不存在就创建,存在就追加) - 如果还想要“仅当文件不存在时才创建”,加上
O_EXCL,和O_CREATE联用 - 写入后记得调
file.Close();用bufio.NewWriter缓冲写入时,别忘了最后writer.Flush(),否则数据可能滞留在内存没落盘 -
os.Create是os.OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, perm)的简写,本质一样,但不支持追加
权限参数 perm、缓冲区大小、是否拷贝字节、Flush 的时机——这些细节看着琐碎,但在生产环境里,一个没注意就可能造成文件不可读、日志丢失或服务 OOM。别图省事跳过它们。


















