Go写CSV需用encoding/csv与os.File,构造二维字符串切片,os.Create建文件后csv.NewWriter包装,Write写入表头和记录,自动处理引号转义,Flush确保写入磁盘,Close释放资源,可选加UTF-8 BOM兼容Windows Excel。

用 Go 语言写入 CSV 文件很简单,关键是用标准库 encoding/csv 配合 os.File,注意字段分隔、引号转义和换行处理即可生成规范的 CSV 表格数据。
准备数据并打开文件写入器
先构造要写入的数据(通常为二维字符串切片),再用 os.Create 创建文件,接着用 csv.NewWriter 包装它。记得在结束前调用 w.Flush() 确保缓冲区内容真正写入磁盘。
- 每行数据是一个
[]string,例如[]string{"张三", "25", "北京"} - 文件名建议带
.csv后缀,路径需有写入权限 - 写入器默认使用英文逗号分隔,不自动加 BOM,符合通用 CSV 规范
写入表头和多行记录
调用 w.Write() 一次写一行。表头和数据行都用相同方式写入,顺序决定列位置。如果某字段含逗号、换行符或双引号,csv.Writer 会自动用双引号包裹并转义内部引号(如 "a""b")。
- 表头示例:
w.Write([]string{"姓名", "年龄", "城市"}) - 数据行示例:
w.Write([]string{"李四", "30", "上海"}) - 含特殊字符时无需手动处理,例如
"abc,def"或"hello\nworld"都能正确编码
处理错误与资源释放
每次 w.Write() 和最终的 w.Flush() 都应检查错误。文件句柄需用 defer f.Close() 及时释放,避免资源泄漏。常见错误包括磁盘满、无权限、路径不存在等。
立即学习“go语言免费学习笔记(深入)”;
- 写入单行后可立即检查:
if err := w.Write(record); err != nil { log.Fatal(err) } -
Flush()必须调用,否则最后一部分数据可能丢失 - 不要依赖
defer f.Close()在 panic 时保证关闭——先Close()再Flush()更稳妥
生成 UTF-8 编码且兼容 Excel 的 CSV
Go 默认生成 UTF-8 文件,Excel(Windows 版)打开时可能乱码,解决方法是在文件开头写入 UTF-8 BOM(\xEF\xBB\xBF)。只需在创建文件后、创建 writer 前,用 f.Write() 写入三个字节即可。
- 添加 BOM 示例:
f.Write([]byte("\xEF\xBB\xBF")) - 仅对 Windows Excel 有效;macOS Numbers 和大多数程序不需要也不推荐 BOM
- 不要用
gob或其他编码,CSV 就是纯文本,保持简单










