10 вопросов
Интерфейсы io.Reader и io.Writer - центральные абстракции Go. io.Copy, bufio.Scanner, io.Pipe, TeeReader, MultiWriter, LimitReader - композиция потоков без загрузки в память.
io.Reader задает контракт: любой тип с методом Read(p []byte) (n int, err error) считается читаемым источником.
Подробнее →io.Writer задает контракт записи: любой тип с методом Write(p []byte) (n int, err error) считается приемником байтов.
Подробнее →os.ReadFile(name) - удобная обертка: открывает файл, читает все содержимое в []byte и закрывает. os.Open возвращает *os.File, который нужно закрыть вручную.
Подробнее →io.Copy стримит данные и не держит все в памяти; io.ReadAll читает все в один срез и подходит для ограниченных объемов.
Подробнее →bufio.Scanner читает ввод по токенам (по умолчанию по строкам), скрывая буферизацию и разбиение.
Подробнее →TeeReader оборачивает Reader и копирует каждый прочитанный кусок в Writer, не меняя логику чтения.
Подробнее →MultiWriter создает один Writer, который при каждой записи дублирует данные во все переданные Writer.
Подробнее →LimitReader оборачивает Reader и после прочтения N байт возвращает io.EOF.
Подробнее →filepath.WalkDir (Go 1.16+) передает fs.DirEntry, который содержит имя и тип без дополнительного системного вызова stat. Walk вызывает os.Lstat для каждого файла, что медленнее.
Подробнее →io.Pipe возвращает связанные Reader и Writer; запись блокируется, пока не прочитают.
Подробнее →