Пакет io предоставляет базовые интерфейсы для работы с потоками ввода-вывода.
Reader и Writer
io.Reader читает данные в байтовый срез. io.Writer записывает байты.
type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
Эти интерфейсы реализуют файлы, сетевые соединения, буферы.
io.Copy
Копирует данные из Reader в Writer без ручного буферизованного цикла.
written, err := io.Copy(dst, src)
Функция сама подбирает оптимальный размер буфера.
io.ReadAll
Читает все данные из Reader до конца.
data, err := io.ReadAll(reader)
Удобно для небольших объемов. Для больших файлов используйте стриминг.
Композиция интерфейсов
io.ReadWriter объединяет Reader и Writer. io.ReadCloser добавляет Close.
type ReadCloser interface {
Reader
Closer
}
TeeReader и MultiWriter
io.TeeReader дублирует чтение в Writer. io.MultiWriter пишет в несколько Writer одновременно.
tee := io.TeeReader(src, logFile)
multi := io.MultiWriter(file1, file2)
Практические советы
Всегда проверяйте количество прочитанных или записанных байт. n может быть меньше len(p) даже без ошибки.
Используйте io.LimitReader для ограничения размера читаемых данных.
Пакет io универсален. Один и тот же код работает с файлами, сетью и буферами.
