Каков правильный способ копирования данных из io.Reader непосредственно в байты назначения. Буфер в golang?

У меня есть код, который хочет скопировать данные из io.Reader непосредственно в структуру bytes.Buffer, которая предназначена для хранения в памяти в качестве кеша. Сейчас просто звоню io.Copy(dstBytesBuffer, reader). Но глядя на код io.Copy, похоже, что он сам создает буфер и копирует данные из считывателя в этот буфер, а затем записывает из этого буфера в мой dstBytesBuffer. Есть ли способ пропустить это и просто скопировать прямо из ридера в мой буфер назначения?

Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
0
130
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использование io.Copy() для этого совершенно нормально. io.Copy() «оптимизирован» для нескольких вариантов использования. Цитата из его документа:

Копируйте копии из src в dst до тех пор, пока не будет достигнут EOF в src или не произойдет ошибка. Он возвращает количество скопированных байтов и первую ошибку, возникшую при копировании, если таковая имеется.

Успешное копирование возвращает err == nil, а не err == EOF. Поскольку Copy определен для чтения из src до EOF, он не рассматривает EOF из Read как ошибку, о которой необходимо сообщить.

Если src реализует интерфейс WriterTo, копирование реализуется путем вызова src.WriteTo(dst). В противном случае, если dst реализует интерфейс ReaderFrom, копирование реализуется путем вызова dst.ReadFrom(src).

Не зная ничего из вашего источника io.Reader , даже если он не предоставляет эффективный WriteTo(dst) метод, мы точно знаем, что вашим пунктом назначения является bytes.Buffer , и он реализует io.ReaderFrom так, как он есть. метод Buffer.ReadFrom(), который считывает данные из заданного io.Reader без создания или использования дополнительных буферов.

Ок спасибо! Да, io.Reader — это io.PipeReader.

bieno002 29.03.2023 18:17

Другие вопросы по теме