I/O и потоки данных

10 вопросов

Интерфейсы io.Reader и io.Writer - центральные абстракции Go. io.Copy, bufio.Scanner, io.Pipe, TeeReader, MultiWriter, LimitReader - композиция потоков без загрузки в память.

1 Что такое интерфейс io.Reader в Go и для чего он нужен? 🟢 Лёгкий
Ответ: A) Интерфейс с методом Read(p []byte) (n int, err error); абстракция любого источника данных

io.Reader задает контракт: любой тип с методом Read(p []byte) (n int, err error) считается читаемым источником.

Подробнее →
2 Что такое интерфейс io.Writer в Go? 🟢 Лёгкий
Ответ: A) Интерфейс с методом Write(p []byte) (n int, err error); абстракция любого приемника данных

io.Writer задает контракт записи: любой тип с методом Write(p []byte) (n int, err error) считается приемником байтов.

Подробнее →
3 Чем os.ReadFile (Go 1.16+) отличается от os.Open + io.ReadAll? 🟢 Лёгкий
Ответ: A) os.ReadFile открывает, читает и закрывает файл в одном вызове; os.Open требует ручного defer Close и чтения

os.ReadFile(name) - удобная обертка: открывает файл, читает все содержимое в []byte и закрывает. os.Open возвращает *os.File, который нужно закрыть вручную.

Подробнее →
4 Когда уместнее использовать io.Copy, а когда io.ReadAll? 🟡 Средний
Ответ: A) io.Copy - для потоковой перекачки без загрузки всего в память; io.ReadAll - когда нужно получить все данные сразу в []byte

io.Copy стримит данные и не держит все в памяти; io.ReadAll читает все в один срез и подходит для ограниченных объемов.

Подробнее →
5 Для чего используется bufio.Scanner и в чем его преимущество при построчном чтении? 🟡 Средний
Ответ: A) Обертка над io.Reader для удобного построчного чтения; сам управляет буфером и разбиением

bufio.Scanner читает ввод по токенам (по умолчанию по строкам), скрывая буферизацию и разбиение.

Подробнее →
6 Что делает io.TeeReader и когда его используют? 🟡 Средний
Ответ: A) Возвращает Reader, который при чтении дополнительно записывает каждый фрагмент в указанный Writer

TeeReader оборачивает Reader и копирует каждый прочитанный кусок в Writer, не меняя логику чтения.

Подробнее →
7 Для чего предназначен io.MultiWriter? 🟡 Средний
Ответ: A) Возвращает Writer, при записи в который данные отправляются во все переданные Writer одновременно

MultiWriter создает один Writer, который при каждой записи дублирует данные во все переданные Writer.

Подробнее →
8 Что делает io.LimitReader и в чем его практическая польза? 🟡 Средний
Ответ: A) Возвращает Reader, который перестает отдавать данные после N байт

LimitReader оборачивает Reader и после прочтения N байт возвращает io.EOF.

Подробнее →
9 Для чего используется filepath.WalkDir и чем он лучше filepath.Walk? 🟡 Средний
Ответ: A) WalkDir (Go 1.16+) эффективнее: передает fs.DirEntry вместо os.FileInfo, не вызывая лишний stat для каждого файла

filepath.WalkDir (Go 1.16+) передает fs.DirEntry, который содержит имя и тип без дополнительного системного вызова stat. Walk вызывает os.Lstat для каждого файла, что медленнее.

Подробнее →
10 Что такое io.Pipe и типичный сценарий его использования? 🔴 Сложный
Ответ: A) Синхронный in-memory pipe: одна горутина пишет, другая читает, данные не накапливаются

io.Pipe возвращает связанные Reader и Writer; запись блокируется, пока не прочитают.

Подробнее →
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.