CSV Writer с использованием буфера приводит к пустой вывод - PullRequest
0 голосов
/ 24 августа 2018

Я создал функцию для получения некоторых данных и их записи в 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 голосов
/ 24 августа 2018

Вам необходимо позвонить 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. возврат сгенерированного байтового среза и ноль
  3. вызов writer.Flush()

Очевидно, что это не предполагаемый порядоктак как нам нужно очистить (и проверить наличие ошибок записи!) перед доступом к сгенерированному фрагменту байта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...