推荐使用os.WriteFile写入单个字符串,简洁安全;ioutil.WriteFile已弃用,须迁移至os包;字符串须转[]byte,权限需显式指定如0644。

用 ioutil.WriteFile 最快写入单个字符串
如果只是把一串文本(比如 JSON、配置内容)一次性写进文件,ioutil.WriteFile 是最直接的选择。它内部自动处理打开、写入、关闭全过程,不用手动管理 *os.File。
注意:Go 1.16+ 中 ioutil 已迁移到 io 包,应改用 os.WriteFile —— 否则会报 undefined: ioutil 错误。
常见错误是忽略返回的 error,导致写入失败却无感知;另一个坑是没指定权限(如 0644),在 Linux/macOS 下可能因默认 umask 导致文件不可读。
os.WriteFile("config.txt", []byte("timeout=30\nretries=3"), 0644)- 字符串必须转成
[]byte,不能直接传string - 权限参数是
os.FileMode类型,写成0644比0o644更通用(Go 不支持0o前缀)
用 os.Create + WriteString 分步控制写入
当需要多次追加、或写入前先检查文件是否存在、或想复用文件句柄时,得走手动打开流程。这时别用 os.OpenFile 配 os.O_WRONLY|os.O_CREATE 然后调 Write——太绕;直接用 os.Create 更清晰。
关键点在于:os.Create 总是截断已有文件,如果要追加,得换 os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)。
-
f, err := os.Create("log.txt")→ 成功后f.WriteString("start\n") - 务必调用
f.Close(),否则文件句柄泄漏,Windows 下还可能锁住文件 -
WriteString比Write([]byte(s))少一次类型转换,语义也更明确
大字符串或频繁写入时避免内存拷贝
如果字符串很大(几 MB 以上),或者循环中反复写入,用 os.WriteFile 或 WriteString 会导致每次分配新字节切片、触发 GC 压力。这时候应该复用 bytes.Buffer 或直接用 bufio.Writer 缓冲输出。
尤其要注意:不要在循环里对同一个 *os.File 反复调 WriteString 而不缓冲——系统调用开销会明显拖慢性能。
-
w := bufio.NewWriter(f); w.WriteString(line); w.Flush()(记得 flush) - 若字符串已存在且只写一次,
os.WriteFile仍是首选,别为了“优化”强行上bufio -
bytes.Buffer适合拼接后再统一写,不适合流式写入
中文乱码或换行符不生效?检查源字符串和目标编码
Go 字符串本身是 UTF-8 编码,写入文件不会自动转码。所谓“乱码”,通常是编辑器用错编码打开(比如用 GBK 打开 UTF-8 文件),或字符串里混了 Windows 风格的 \r\n 但在 Unix 环境下显示异常。
真正要干预编码的场景极少(例如必须生成 GBK 文件),此时不能靠标准库,得用 golang.org/x/text/encoding 包转换字节流。
- 确认字符串字面值是否含
\r\n:打印fmt.Printf("%q", s)看转义符 - 写入后用
file(1)命令查编码:file -i config.txt - 编辑器里右下角切换编码为 UTF-8,再重载文件
写文件看着简单,但权限、编码、缓冲、错误处理这四点,任何一个漏掉都可能让程序在线上静默失败。特别是 os.WriteFile 的权限参数和 os.Create 后的 Close,新手最容易跳过去。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











