用 os.writefile 写入 utf-8 文件最简单:go 字符串默认 utf-8,[]byte(content) 零拷贝获取字节流,直接 os.writefile("f.txt", []byte(content), 0644) 即可;避免 os.create + writestring 非原子操作,追加或大文件才用 os.openfile 配 io.writestring。

用 os.WriteFile 写入 UTF-8 文件最简单
Go 默认字符串就是 UTF-8 编码,只要不手动转码、不误用其他编码,写入文件天然就是 UTF-8。直接用 os.WriteFile 即可,它接收 []byte,而 string 转 []byte 是零拷贝的 UTF-8 字节序列:
content := "你好,世界!\nHello, 世界!"
err := os.WriteFile("output.txt", []byte(content), 0644)
if err != nil {
log.Fatal(err)
}
注意:不要用 os.Create + .WriteString 拼接多段内容再写——看似方便,但若中间有 nil 或错误处理遗漏,容易漏写或截断;os.WriteFile 是原子写入,更安全。
需要追加或分块写入时,用 os.OpenFile 配 io.WriteString
如果文件要反复追加、或内容太大不能一次性加载进内存,就得用文件句柄方式。关键点是:打开时指定 os.O_APPEND | os.O_CREATE | os.O_WRONLY,且**必须显式设置 os.O_TRUNC 来覆盖旧内容,否则默认不会清空**:
- 追加写:
os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) - 覆盖写:
os.OpenFile("config.json", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
io.WriteString 接收 io.Writer 和 string,内部直接按 UTF-8 字节写入,无需额外处理。别用 fmt.Fprint 做简单写入——它会额外做格式化判断,轻微开销且无必要。
写入含 BOM 的 UTF-8 文件?Go 不推荐,但可以手动加
标准 UTF-8 不需要 BOM,Go 生态也基本不识别或生成 BOM。Windows 记事本等老工具依赖 BOM 判断编码,如果你必须兼容它,就手动在字节切片开头插入 BOM(0xEF 0xBB 0xBF):
bom := []byte{0xEF, 0xBB, 0xBF}
contentBytes := append(bom, []byte("你好")...)
os.WriteFile("with-bom.txt", contentBytes, 0644)
但要注意:加了 BOM 后,用 json.Unmarshal 或 toml.Decode 可能报错(如 invalid character 'ï' looking for beginning of value),因为解析器不预期开头有这 3 个字节。除非明确对接旧系统,否则跳过 BOM。
文件路径含中文时,Windows 下可能出错
Go 1.16+ 在 Windows 上已原生支持 UTF-8 路径,但前提是终端/IDE 环境本身用了 UTF-8 编码。如果遇到 open 你好.txt: The system cannot find the file specified,先检查:
- 命令行是否执行过
chcp 65001(切换到 UTF-8 代码页) - VS Code 终端设置里是否启用了
"terminal.integrated.env.windows": {"PYTHONIOENCODING": "utf-8"}类似配置 - 避免用
filepath.Join拼出带\uFFFD替换符的路径——那是解码失败的标志,说明输入字符串本身已损坏
真正麻烦的不是写入内容,而是路径在传递过程中被系统层二次转码。一旦出现乱码路径,后续所有 os 操作都会失败,且错误信息不提示编码问题。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











