Пакет io предоставляет базовые интерфейсы для примитивов ввода-вывода.
Обратите внимание, что поскольку эти интерфейсы и примитивы используют низкоуровневые операции с различными реализациями, не стоит предполагать, что они безопасны для параллельного выполнения, конечно, если об ином явно не сказано в документации.
Давайте рассмотрим наиболее важные интерфейсы и методы в этом пакете.
Сигнатура интерфейса Reader выглядит вот так:
type Reader interface {
Read(p []byte) (n int, err error)
}
Read считывает до len(p) байтов в слайс байт p. Он возвращает количество прочитанных байтов и ошибку, если она произошла в процессе чтения. Даже если Read возвращает n < len(p) байт, он может использовать все p байт в качестве пустого места во время вызова.
Сигнатура интерфейса Writer выглядит вот так:
type Writer interface {
Write(p []byte) (n int, err error)
}
Write записывает len(p) байт из слайса байт p в базовый поток данных. Он возвращает количество байт, записанных из p и любую обнаруженную ошибку, которая привела к преждевременной остановке записи. Write должна возвращать ненулевую ошибку, если она возвращает n < len(p) байт. Write не должна изменять данные среза, даже временно.
Интерфейс Closer закрывает поток данных, для которого определен. Он имеет следующую сигнатуру:
type Closer interface {
Close() error
}
Объединением троих выше рассмотренных интерфейсов является ReadWriteCloser.
type ReadWriteCloser interface {
Reader
Writer
Closer
}
В пакете содержится ряд полезных функций для работы с интерфейсами, описанными выше.