Пакет io предоставляет базовые интерфейсы для примитивов ввода-вывода.

Обратите внимание, что поскольку эти интерфейсы и примитивы используют низкоуровневые операции с различными реализациями, не стоит предполагать, что они безопасны для параллельного выполнения, конечно, если об ином явно не сказано в документации.

Давайте рассмотрим наиболее важные интерфейсы и методы в этом пакете.

Интерфейсы

Reader

Сигнатура интерфейса Reader выглядит вот так:

type Reader interface {
	Read(p []byte) (n int, err error)
}

Read считывает до len(p) байтов в слайс байт p. Он возвращает количество прочитанных байтов и ошибку, если она произошла в процессе чтения. Даже если Read возвращает n < len(p) байт, он может использовать все p байт в качестве пустого места во время вызова.

Writer

Сигнатура интерфейса Writer выглядит вот так:

type Writer interface {
	Write(p []byte) (n int, err error)
}

Write записывает len(p) байт из слайса байт p в базовый поток данных. Он возвращает количество байт, записанных из p и любую обнаруженную ошибку, которая привела к преждевременной остановке записи. Write должна возвращать ненулевую ошибку, если она возвращает n < len(p) байт. Write не должна изменять данные среза, даже временно.

Closer

Интерфейс Closer закрывает поток данных, для которого определен. Он имеет следующую сигнатуру:

type Closer interface {
	Close() error
}

ReadWriteCloser

Объединением троих выше рассмотренных интерфейсов является ReadWriteCloser.

type ReadWriteCloser interface {
	Reader
	Writer
	Closer
}

Функции

В пакете содержится ряд полезных функций для работы с интерфейсами, описанными выше.