Go 标准库 encoding/csv 提供高效 CSV 读写能力,需注意分隔符、引号、换行、Flush 和 UTF-8 编码(推荐无 BOM)等细节,支持流式处理与错误检查。

Go 语言标准库 encoding/csv 提供了简洁、高效的 CSV 文件读写能力,无需第三方依赖。关键在于理解 csv.Reader 和 csv.Writer 的使用方式,注意编码、分隔符、引号、换行等细节。
读取 CSV 文件(按行或按记录)
使用 os.Open 打开文件,再传给 csv.NewReader。推荐用 ReadAll() 一次性读取全部数据(适合中小文件),或用循环调用 Read() 逐行处理(适合大文件、流式场景)。
- 默认分隔符是逗号(
,),如需其他(如制表符),可设置reader.Comma = '\t' - CSV 字段含换行、逗号或双引号时,会自动被双引号包裹;
csv.Reader默认能正确解析 - 首行常为表头,可用
Read()先读一次获取 header,后续每行用map[string]string关联字段
写入 CSV 文件(手动构造或结构体映射)
用 os.Create 创建文件,包装为 csv.NewWriter。写入前建议调用 writer.Write(header) 写表头。每条记录调用 writer.Write([]string{...}) 即可。
- 写入后必须调用
writer.Flush(),否则缓冲区内容可能丢失 - 若字段含双引号、换行符,
csv.Writer会自动加引号并转义,无需手动处理 - 如需导出结构体,可先用反射或手动提取字段值转为
[]string,再写入
处理中文与 UTF-8 编码问题
Go 原生字符串是 UTF-8,只要文件本身保存为 UTF-8(无 BOM 推荐),读写不会乱码。但 Windows 记事本默认保存为 GBK 或带 BOM 的 UTF-8,易出错。
立即学习“go语言免费学习笔记(深入)”;
- 读取前可用
golang.org/x/text/encoding检测并转换编码(如 GBK → UTF-8),但更稳妥的是统一要求源文件为 UTF-8(无 BOM) - 写入时,可开头写入 UTF-8 BOM(
\xEF\xBB\xBF)让 Excel 正确识别中文(仅 Windows Excel 需要,非必须)
错误处理与性能提示
CSV 解析可能在任意行失败(格式错误、字段数不一致等),应始终检查 err。对大文件,避免全量加载到内存,优先用流式读写。
-
Read()返回[]string和error,空切片 +io.EOF表示结束 - 用
csv.NewReader(bufio.NewReader(file))包一层可提升小文件读取效率 - 并发写多个 CSV?确保每个
*csv.Writer独立,且写入时加锁或使用 channel 序列化
基本上就这些。标准库够用,逻辑清晰,不复杂但容易忽略 Flush 和编码细节。










