使用缓冲区的csv writer导致空输出

Gal*_*lil 3 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
}
Run Code Online (Sandbox Code Playgroud)

问题是buf.Bytes()始终为空,即使输入不为空且没有抛出错误.

mae*_*ics 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
}
Run Code Online (Sandbox Code Playgroud)

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

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

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