os.writefile最快最安全覆盖写入小到中等数据,但需检查error;大文件须流式写入并手动管理*os.file,避免oom和句柄泄漏。

用 os.WriteFile 最快最安全
直接覆盖写入,适合小到中等大小的 []byte(比如配置、JSON、日志片段),底层自动处理文件创建、权限、关闭,不用手动 defer 或 Close()。
常见错误是忽略返回的 error —— 即使路径存在,磁盘满、权限不足、父目录不存在都会失败,不检查就静默丢数据。
-
os.WriteFile("config.json", data, 0644):第三个参数是文件权限,Linux/macOS 生效,Windows 忽略 - 如果要追加而非覆盖,
os.WriteFile不适用,得换方案 - 超过几十 MB 时,
os.WriteFile会一次性加载进内存,可能触发 OOM;此时应改用流式写入
用 os.OpenFile + Write 控制写入模式
需要追加、原子替换、或分块写大文件时必须用这个组合。它暴露了底层 *os.File,给你精确控制权,但也意味着你得自己管好错误和资源释放。
典型误用是忘记 defer f.Close(),导致文件句柄泄漏;或者用 os.O_CREATE | os.O_WRONLY 而没加 os.O_TRUNC,结果旧内容残留。
- 追加:
f, _ := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) - 覆盖(清空再写):
os.O_CREATE | os.O_WRONLY | os.O_TRUNC - 写完务必检查
f.Write(data)的返回值,它可能只写入部分字节(尤其在信号中断或磁盘满时)
大文件写入别直接传整个 []byte
一个 200MB 的切片传给 os.WriteFile,Go 运行时会尝试分配同等大小的临时缓冲区,容易卡顿甚至崩溃。这时应该边生成边写,或用 bufio.Writer 缓冲。
比如从网络读响应体再落地:不要先 ioutil.ReadAll(resp.Body) 再写,而是用 io.Copy 直接流式转发。
-
buf := bufio.NewWriter(f),然后buf.Write(data)+buf.Flush(),能减少系统调用次数 - 如果数据来自 channel 或迭代器,用
for range分批Write,每批几 KB 到几百 KB 较稳妥 -
io.Copy内部已做缓冲,对大文件最省心:io.Copy(f, reader)
注意 Windows 下的换行符和路径分隔符
Go 标准库多数函数(如 os.WriteFile)对换行符不做转换,\n 就是 \n。如果你写的文件要被 Windows 记事本打开且希望正常换行,得自己把 \n 替成 \r\n。
路径拼接也一样:"dir/file.txt" 在 Windows 上能工作,但更健壮的做法是用 path/filepath.Join("dir", "file.txt"),它会自动选 \ 或 /。
- 文本文件跨平台兼容:写入前用
strings.ReplaceAll(text, "\n", "\r\n") - 二进制数据(如图片、protobuf)完全不用管换行符,保持原样即可
- 权限掩码
0644在 Windows 上无效,但不会报错,只是忽略
os.WriteFile 就够了;剩下 10% 的复杂需求,核心就两条:手动管理 *os.File 生命周期,以及永远别假设 Write 一次写完全部字节。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











