Пакет 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
}
В пакете содержится ряд полезных функций для работы с интерфейсами, описанными выше.