Интерфейсы для чтения и записи байтов: Read(p []byte) (n int, err error), Write(p []byte) (n int, err error). Много типов их реализуют: файлы, сеть, буферы, сжатие. Композиция: io.Copy(dst, src), io.MultiWriter, io.TeeReader, bufio.Reader оборачивает Reader. В Go редко нужны большие иерархии - достаточно маленьких интерфейсов.
n, err := io.Copy(w, r)
buf := bufio.NewReader(r)
line, _ := buf.ReadString('\n')