csv.writer必须显式调用flush()才能落盘,传入[]string是硬性要求,nil或非字符串类型会panic;bom需手动写入\ufeff,否则excel打开中文乱码。

csv.Writer 不是“调用即写入”,必须配 Flush() 才能落盘;传 []string 是硬性要求,nil、int、time.Time 直接 panic;BOM 要手动写,否则 Excel 打开中文乱码。
csv.NewWriter 只接受 io.Writer,不接受 []byte 或自定义结构体
常见错误是把 bytes.Buffer 直接强转成 *os.File,或试图传 &buf 给 csv.NewWriter——编译报错或运行时 panic。它只认实现了 Write([]byte) (int, error) 的类型,且需支持流式写入。
- 导出文件:用
os.Create("out.csv")得到*os.File,再传给csv.NewWriter - HTTP 下载:直接传
http.ResponseWriter,但必须在第一次Write()前设置响应头:w.Header().Set("Content-Type", "text/csv; charset=utf-8")、w.Header().Set("Content-Disposition", "attachment; filename=data.csv") - 测试用
bytes.Buffer:合法,但得先确保它是io.Writer(它本来就是),最后用buf.Bytes()拿内容,不能省略这步
Write() 必须传 []string,字段要提前转字符串
csv.Writer.Write() 签名是 func (w *Writer) Write(record []string) error,不支持自动类型转换。传 []interface{} 或含 nil、bool、time.Time 的切片,轻则输出 {0 0},重则 panic。
使用 qbo-mileage CLI 及用户凭证,从 Airtable、Outlook 或 Google Calendar 记录生成 QuickBooks Online 里程 CSV 文件。
- 数字转字符串:用
strconv.Itoa(i)、strconv.FormatFloat(f, 'f', -1, 64) - 时间转字符串:用
t.Format("2006-01-02 15:04:05"),别用fmt.Sprintf("%v", t) - 空值统一用
"",别留nil或跳字段 - 结构体别依赖反射:标准库完全忽略
csv:"name"标签,必须手动取字段拼[]string
Flush() 不是可选操作,是数据写入的必要环节
csv.Writer 默认带 4KB 缓冲,不 Flush() 就退出函数或程序,最后一块数据永远卡在内存里。HTTP 场景下更致命:没 Flush(),浏览器可能超时、只收到半截、甚至把 CSV 当 HTML 渲染。
- 别只靠
defer w.Flush():panic 时 defer 可能不执行,建议每批写完后显式调一次 -
WriteAll()内部会Flush(),但只管本次调用,后续追加写仍需自己Flush() - 务必检查
w.Error():它汇总缓冲期内所有失败,比只看Write()返回值更可靠 - 写大文件时,可传自定义
bufio.Writer控制缓冲大小,比如csv.NewWriter(bufio.NewWriterSize(file, 64*1024))
Excel 打不开或中文乱码?BOM 和 UTF-8 合法性缺一不可
Go 字符串默认 UTF-8,但 Windows Excel 默认用 GBK 解析 CSV 文件。不加 BOM 就等于没告诉 Excel “这是 UTF-8”,它就按本地编码硬解,必然乱码。
- 写文件前先写 BOM:
f.Write([]byte{0xEF, 0xBB, 0xBF}),之后再创建csv.Writer - 字段里不能含非法 UTF-8 字节:比如 MySQL binary 字段里的
\x00、C 字符串残留控制符,会导致write error: bad utf-8 - 校验用
unicode/utf8.ValidString(s),无效时替换为?或丢弃,别硬塞 - 别尝试写 GBK:Go 标准库不原生支持,强行转码易出错,BOM + UTF-8 是唯一稳妥路径
最容易被忽略的是:BOM 必须写在文件最开头,且 Flush() 必须在所有 Write() 之后、文件关闭之前完成;而 w.Error() 往往比 Write() 的返回值更能暴露真实问题。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










