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