У меня есть простая функция, которая считывает что-то из io.Reader в байтовый срез:
func ReadSomething(r io.Reader) {
bufReader := bufio.NewReader(r)
buf := make([]byte, 1024)
bufReader.Read(buf)
...
}
Как видите, чтобы использовать буферизованное чтение, принятый io.Reader оборачивается bufio.Reader.
Однако bufio.Reader сама по себе является реализацией io.Reader, которую может принять эта функция. Поскольку эта функция не знает, что именно она получила, это может привести к вложенному использованию bufio.Reader.
Я рассмотрел возможность изменения типа r на bufio.Reader, чтобы принудительно попросить верхние уровни выполнить перенос, чтобы моя функция могла просто использовать его как есть, но поскольку перенос может выполняться неоднократно, я думаю, что лучше оставить его на нижних уровнях. .
Есть ли какие-нибудь хорошие идеи, как избежать вложенного использования bufio.Reader в моем случае?
@CeriseLimón Спасибо за разъяснение. Я только что прочитал исходный код bufio.NewReader и обнаружил, что он вызывает bufio.NewReader. Мой вопрос не имеет смысла.

Если вы проверите исходный код bufio.NewReader(), вы обнаружите, что об этом уже позаботились.
NewReader() вызывает NewReaderSize() с размером буфера по умолчанию (4096 байт). NewReaderSize() проверяет, является ли io.Reader, который нужно прочитать, уже bufio.Reader. Если это так, и если размер буфера в этом буферизованном считывателе по крайней мере равен желаемому размеру, то вместо того, чтобы обертывать bufio.Reader вокруг io.Reader, он просто возвращает сам io.Reader.
т. е. NewReader() будет вкладывать bufio.Reader вокруг другого bufio.Reader только в том случае, если вложенный считыватель имеет размер буфера меньше, чем размер по умолчанию (4096 байт), чтобы избежать возврата буферизованного считывателя с меньшим буфером, чем запрошено.
Это упоминается в документации, но только для NewReaderSize(); это также относится и к NewReader(), хотя это явно не задокументировано, но очевидно в коде.
Код в вопросе позволяет избежать ненужной вложенности. В документации bufio.NewReader говорится: Если аргумент io.Reader уже является Reader достаточно большого размера, он возвращает базовый Reader.