登录
首页 >  Golang >  Go问答

使用缓冲区的 csv 编写器会导致空输出

来源:stackoverflow

时间:2024-04-25 12:36:35 344浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《使用缓冲区的 csv 编写器会导致空输出》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

我创建了一个函数来获取一些数据并将其写入 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() 始终为空,即使输入不为空并且没有抛出错误。


解决方案


在调用.bytes()之前需要先调用writer.flush(),并在返回之前检查.Error()

// TODO: remove `defer writer.Flush()`
  // ...

  writer.Flush()

  if err := writer.Error(); err != nil {
    return nil, err
  }

  return buf.Bytes(), nil
}

您的示例代码按以下顺序执行操作:

  1. 调用 buf.bytes()
  2. 返回生成的字节片和nil
  3. 调用 writer.flush()

显然这不是预期的顺序,因为我们需要在访问生成的字节切片之前刷新(并检查任何编写器错误!)。

到这里,我们也就讲完了《使用缓冲区的 csv 编写器会导致空输出》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>