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

时间:2018-08-24 15:28:56

标签: go

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

1 个答案:

答案 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
}

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

  1. 致电buf.Bytes()
  2. 返回生成的字节片和nil
  3. 致电writer.Flush()

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