os.WriteFile是Go 1.16+推荐的快速写入方式,需传入[]byte、八进制权限(如0644),不自动创建父目录;追加用os.OpenFile配O_APPEND|O_CREATE|O_WRONLY;注意UTF-8编码与换行符适配。

用 ioutil.WriteFile 最快写入字符串(Go 1.16+ 推荐)
Go 1.16 起 ioutil 已弃用,但它的替代品 os.WriteFile 用法几乎一致,且更轻量。直接传入字符串字节即可,不用手动转 []byte —— 实际上你得自己转,因为函数只接受字节切片。
常见错误是忘记调用 []byte(yourString),导致编译报错 cannot use string as []byte。
-
os.WriteFile("output.txt", []byte("hello world\n"), 0644)—— 成功写入,权限为用户可读写、组和其他用户只读 - 权限参数不能写成
0777或"0644",必须是八进制整数字面量(前面加0) - 如果文件路径含多级目录(如
logs/app.log),os.WriteFile不会自动创建父目录,会返回no such file or directory
需要自动创建目录?用 os.MkdirAll + os.Create 配合
当目标路径存在嵌套目录(比如 data/2024/06/)时,必须先确保路径存在,否则 os.Create 或 os.WriteFile 都会失败。
典型场景:按日期生成日志文件、保存用户上传的文本到归档目录。
立即学习“go语言免费学习笔记(深入)”;
- 先调用
os.MkdirAll("data/2024/06", 0755),它会逐级创建缺失的目录 - 再用
f, err := os.Create("data/2024/06/report.txt")获取文件句柄 - 接着用
f.WriteString("content")或io.WriteString(f, "content")写入(注意:WriteString比Write少一次[]byte转换) - 别忘了
defer f.Close(),否则文件可能不落盘或句柄泄漏
追加写入而不是覆盖?选 os.OpenFile 并设置标志位
os.WriteFile 总是覆盖,没法追加。要实现类似 echo "line" >> file.txt 的效果,必须用 os.OpenFile 并传入 os.O_APPEND | os.O_CREATE | os.O_WRONLY。
容易踩的坑是漏掉 os.O_CREATE:如果文件不存在,仅用 O_APPEND 会导致 open /path/to/file: no such file or directory。
f, err := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)- 之后仍可用
f.WriteString("new line\n") - 注意:
O_APPEND保证每次写都发生在文件末尾,即使多个 goroutine 同时写也安全(内核级别原子)
中文乱码或换行异常?检查源字符串编码和换行符
Go 字符串默认是 UTF-8 编码,只要终端/编辑器支持 UTF-8,就不会乱码。真正出问题的往往是换行符:Windows 记事本只认 \r\n,而 Go 默认只输出 \n。
如果你的目标是让文件在 Windows 上双击用记事本打开不显示“黑框”或挤成一行,就得显式补 \r。
- 写入前处理:
content = strings.ReplaceAll(content, "\n", "\r\n")(简单粗暴,慎用于含 \r\n 原始数据的场景) - 更稳妥的做法是只在最后一行补:
content += "\r\n"(适合单行日志) - 如果内容来自用户输入或网络,且含 Windows 风格换行,
strings.ReplaceAll(content, "\r\n", "\n")统一后再写,避免混用
权限、路径、编码、换行——这四个点没对齐,哪怕代码语法全对,文件看起来也像“写进去了但打不开”或者“内容少了一半”。


















