Запись в файл размером Golang - PullRequest
4 голосов
/ 27 мая 2020

Я новичок в Golang и еще не уверен, как использовать определенные языковые конструкции. В настоящее время у меня есть следующий код (с тестовыми выходами отладки), который не дает ожидаемого результата:

    json, _ := json.Marshal(struct)
    fmt.Println(json)

    f,_ := os.Create(fmt.Sprintf("/tmp/%s.json", "asd"))

    i,_ := f.Write(json)
    fmt.Println(i)  

    b, err := ioutil.ReadAll(f)
    fmt.Print(b)

Я ожидаю следующего поведения:

  • перевод структуры в массив байтов
  • создание нового файла
  • добавление байтового массива к файлу

Однако файл всегда пуст, когда я запускаю код в своей среде (AWS Lambda), а также использовать его в Golang Playground. Вывод приведенного выше кода выглядит следующим образом:

[123 34 ... <hug array of bytes>]
1384
[]

, что наводит меня на мысль, что я использую f.Write() неправильно, хотя я следовал документации пакета. Все остальные результаты указывают на ожидаемое поведение, в чем же моя ошибка? Я несколько ограничен использованием интерфейса File, иначе я бы выбрал ioutil.WriteFile(). Мое предположение - неправильное понимание указателя / значений в какой-то момент, но компилятор предотвратил использование &f.

1 Ответ

5 голосов
/ 27 мая 2020

После f.Write() ваша текущая позиция в файле находится в конце, поэтому ioutil.ReadAll() будет читать из этой позиции и ничего не вернет.

Вам нужно вызвать f.Sync() , чтобы убедиться, что данные постоянно сохраняются на диск, а затем f.Seek(0, 0), чтобы сначала перемотать к началу файла.

Обновление: из комментариев, кажется что вам нужно только сериализовать JSON и передать его как io.Reader, для этого вам действительно не нужен файл, благодаря bytes.Buffer:

data, _ := json.Marshal(s)
buf := bytes.NewBuffer(data)
b, _ := ioutil.ReadAll(buf)
fmt.Print(string(b))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...