Как работает io.Reader и io.Writer?

Middle
1.1k просмотров
AFK Offer AI

io.Reader и io.Writer — два самых важных интерфейса в Go. Reader имеет один метод Read(p []byte) (n int, err error), Writer — Write(p []byte) (n int, err error). Всё.

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

Их реализуют десятки типов: файлы, HTTP-тела, буферы, сжатие, шифрование, сетевые соединения. Благодаря этому можно комбинировать их как конструктор: читаешь из файла → разжимаешь → дешифруешь → парсишь, и всё это через цепочку Reader-ов.

f, _ := os.Open("data.gz")
gzReader, _ := gzip.NewReader(f)
io.Copy(os.Stdout, gzReader)

Ключевое правило: Read может вернуть данные И ошибку одновременно (n > 0 и err == io.EOF). Всегда обрабатывай данные перед проверкой ошибки.

Следующий вопрос

Горутины — что это?