最简单写入[]byte切片用os.WriteFile(Go 1.16+替代ioutil.WriteFile),注意权限0644;写[]string宜用bufio.Writer逐行写并显式Flush;结构体切片优先json.Marshal序列化;大切片需流式写入+临时文件+原子提交。

用 ioutil.WriteFile 一次性写入切片内容最简单
如果切片是 []byte 类型(比如字符串转来的),直接用 ioutil.WriteFile 是最快路径。它内部自动处理文件打开、写入、关闭全过程,避免手动管理 *os.File 的出错风险。
常见错误是传入非 []byte 切片——比如 []int 或 []string,会编译失败,因为该函数只接受 []byte。
- 先用
strings.Join或fmt.Sprint把其他类型切片转成字符串,再用[]byte(str)转换 - 注意权限参数:Windows 下
0644没问题,Linux/macOS 上若需执行权限才设0755,一般写文本用0644即可 -
ioutil.WriteFile在 Go 1.16+ 已被移到os.WriteFile,新项目优先用os.WriteFile
data := []byte("hello, world\n")
os.WriteFile("output.txt", data, 0644)
写 []string 切片时,用 bufio.Writer 控制换行和性能
直接把 []string 转 []byte 容易丢格式——比如每行没换行符,或中间多空格。这时更适合逐行写入,bufio.Writer 能缓冲 I/O,比反复调用 os.WriteFile 快得多,尤其切片大时。
容易踩的坑是忘记调用 w.Flush():不 flush,最后一部分数据可能卡在缓冲区没落盘,文件看起来是空的或内容截断。
立即学习“go语言免费学习笔记(深入)”;
- 每行末尾自己加
\n,WriteString不自动加 - 打开文件用
os.Create或os.OpenFile(..., os.O_CREATE|os.O_WRONLY|os.O_TRUNC),确保覆盖旧内容 - 别用
fmt.Fprintln(w, s)代替w.WriteString(s + "\n"),前者额外格式化开销大,且可能引入空格
f, _ := os.Create("lines.txt")
w := bufio.NewWriter(f)
for _, s := range []string{"a", "b", "c"} {
w.WriteString(s + "\n")
}
w.Flush() // 关键!
f.Close()
结构体切片要序列化,优先选 json.Marshal 而不是手拼字符串
直接 fmt.Sprint 或循环 fmt.Sprintf 拼接结构体切片,可读性差、难解析、字段顺序不固定、嵌套字段易出错。用 json.Marshal 生成标准 JSON 字符串,既可读又方便后续程序读取。
注意导出字段限制:只有首字母大写的字段(即导出字段)才会被 json.Marshal 序列化;小写字母开头的字段默认忽略,不会报错也不会提示。
- 用
json.MarshalIndent加缩进,适合调试或人工查看;生产写文件用json.Marshal更小更快 - 如果结构体含时间、字节切片等非 JSON 原生类型,得自定义
MarshalJSON方法或用第三方库如ffjson - 写完记得检查返回的
error:比如结构体含func字段会直接 panic,但json.Marshal返回UnsupportedType错误
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
users := []User{{"Alice", 30}, {"Bob", 25}}
b, _ := json.Marshal(users)
os.WriteFile("users.json", b, 0644)
大切片写文件必须考虑内存和错误恢复
几百万元素的 []string 或大结构体切片,全量转 []byte 可能吃光内存;一次写失败(如磁盘满),前面写的内容还留在文件里,造成脏数据。
这时候不能图省事,得拆成流式写入 + 错误检查 + 临时文件原子提交。
- 用
os.OpenFile(..., os.O_CREATE|os.O_WRONLY|os.O_EXCL)创建临时文件,避免覆盖原文件 - 每写一批(比如 1000 行)就检查
error,及时中断并清理临时文件 - 全部成功后,用
os.Rename原子替换目标文件(同分区下是原子操作) - 别依赖
defer f.Close()做清理:defer 在函数 return 后才执行,错误发生时可能已来不及删临时文件
复杂点在于临时文件路径生成、跨平台换行符统一、以及磁盘空间预估——这些都不是语言自带的,得自己加逻辑或引入辅助库。


















