我创建了一个函数来获取一些数据并将其写入CSV,并将输出存储在缓冲区中。
type OptIn struct {
Email string `json:"email"`
LastUpdate string `json:"opt_in_last_update"`
}
func writeCSV(data []OptIn) ([]byte, error) {
var buf bytes.Buffer
writer := csv.NewWriter(&buf)
defer writer.Flush()
for _, obj := range data {
var record []string
record = append(record, obj.Email)
record = append(record, obj.LastUpdate)
err := writer.Write(record)
if err != nil {
panic(err.Error())
}
}
return buf.Bytes(), nil
}
问题是buf.Bytes()
始终为空,即使输入不为空并且没有引发任何错误。
答案 0 :(得分:7)
您需要先致电writer.Flush()
,然后再致电.Bytes()
,并在返回之前检查.Error()
:
// TODO: remove `defer writer.Flush()`
// ...
writer.Flush()
if err := writer.Error(); err != nil {
return nil, err
}
return buf.Bytes(), nil
}
您的示例代码按以下顺序执行操作:
buf.Bytes()
writer.Flush()
这显然不是预期的顺序,因为我们需要在访问生成的字节片之前刷新(并检查是否有写错误!)。