CSV
CSV 是记录格式,不是简单的逗号分隔字符串。encoding/csv 能正确处理引号、逗号、嵌入换行和转义;不要用 strings.Split 代替。
读取和写入
package main
import (
"encoding/csv"
"fmt"
"io"
"strings"
)
func main() {
reader := csv.NewReader(strings.NewReader("id,name\n1,\"Ada, Lovelace\"\n"))
for {
record, err := reader.Read()
if err == io.EOF {
break
}
if err != nil {
panic(err)
}
fmt.Println(record)
}
}
默认情况下 Reader 会检查每行字段数;固定列格式可设置 FieldsPerRecord,动态列格式则要在业务层明确缺失和多余字段。写入使用 csv.Writer,结束时必须调用 Flush 并检查 Error。
输入边界与兼容性
对上传文件设置总大小、单行长度和记录数限制。明确字符编码、表头是否必需、空字段含义、时区和数字精度;CSV 本身没有类型系统,所有字段都需要业务转换和校验。
常见错误
- 用字符串分割处理含引号或换行的字段。
- 忽略
Read、Write、Flush和Error。 - 未限制上传文件大小或单行长度。
- 把字段解析成功当作业务校验成功。
- 未定义表头、空字段和编码规则。
小结
- 使用
encoding/csv处理语法,不手写分隔逻辑。 - 读取和写入都要检查错误,外部输入必须限制大小。
- CSV 的字段类型、兼容性和空值语义需要业务契约定义。