go语言标准库高效支持csv和json文件的解析、转换与批量读写;csv通过encoding/csv映射结构体并处理表头与类型,json用encoding/json流式编解码;二者可互转并批量清洗,结合缓冲区复用、bufio.writer等优化性能。

Go 语言处理 CSV 和 JSON 文件非常高效,标准库已提供稳定支持,无需额外依赖即可完成解析、转换、批量读写等常见数据操作任务。
CSV 文件读取与结构化解析
使用 encoding/csv 包可直接将 CSV 行映射为结构体。关键在于定义字段标签(csv),并注意跳过表头、处理空行和类型转换。
- 用
csv.NewReader包装*os.File或strings.Reader - 调用
Read()逐行读取,或用ReadAll()一次性加载(适合小文件) - 结构体字段加
csv:"name"标签匹配列名;用csv:"name,omitempty"忽略空值 - 若首行为标题,调用
reader.Read()一次跳过,再用reader.FieldsPerRecord = -1允许不一致列数
JSON 文件的序列化与流式处理
encoding/json 支持结构体 ↔ JSON 的双向编解码。对大文件建议用 json.Decoder 流式解析,避免内存暴涨。
- 结构体字段需导出(首字母大写),并用
json:"field_name"指定键名 - 读取单个 JSON 对象:用
json.NewDecoder(file).Decode(&v) - 读取 JSON 数组:循环调用
Decode(),或先json.Unmarshal整体解析为[]map[string]interface{} - 写入时用
json.NewEncoder(w).Encode(v),自动换行并处理转义
CSV 与 JSON 互转及批量清洗
常见需求是把 CSV 转成 JSON 数组用于 API,或把 JSON 日志批量导出为 CSV 做报表。核心是统一中间结构(如 []map[string]interface{} 或自定义 struct 切片)。
立即学习“go语言免费学习笔记(深入)”;
- CSV → JSON:先按结构体或 map 读取所有行,再用
json.MarshalIndent格式化输出 - JSON → CSV:解析 JSON 数组后,提取每项的键作为表头,值作为记录;可用
csv.Writer.Write()逐行写入 - 批量清洗:在解析循环中加入校验逻辑(如非空检查、正则过滤、时间格式标准化)再写入新文件
- 错误处理别忽略:记录错误行号和原始内容,避免因单行失败中断整个流程
性能优化与实用技巧
处理万级以上记录时,几个小调整能明显提升效率和稳定性。
- 读 CSV 时复用
[]string缓冲区:设置reader.FieldsPerRecord并重用切片 - 写文件优先用
bufio.Writer包裹*os.File,减少系统调用次数 - 多协程处理需谨慎:CSV/JSON 解析本身无锁,但写入同一文件必须加锁或分文件输出
- 用
golang.org/x/exp/maps(Go 1.21+)简化 map 操作,比如键存在性判断或默认值填充










