回顾

strings.Builder 类型

  • 主要用于构建字符串
  • 它的指针类型实现的接口有:io.Writer、io.ByteWriter和fmt.Stringer

strings.Reader 类型

  • 主要用于读取字符串
  • 它的指针类型实现的接口有:io.Reader、 io.ReaderAt、io.ByteReader、io.RuneReader、io.Seeker、io.ByteScanner、io.RuneScanner、io.WriterTo

bytes.Buffer 类型

  • 集读、写功能于一身的数据类型,非常适合作为字节序列的缓冲区
  • 该指针类型实现的读取相关接口:
  1. io.Reader
  2. io.ByteReader
  3. io.RuneReader
  4. io.ByteScanner
  5. io.RuneScanner
  6. io.WriterTo
  • 该指针类型实现的写入相关接口:
  1. io.Writer
  2. io.ByteWriter
  3. io.stringWriter
  4. io.ReaderFrom

io 包

简单说是为了提高不同程序实体之间的户操作性
**

io包中用于拷贝数据的函数:

  • io.Copy
  • io.CopyBuffer
  • io.CopyN

以上函数会接收两个参数,即:用于代表数据的目的地、io.Writer类型的参数dst,以及用于代表数据来源的、io.Reader类型的参数src

  1. src := strings.NewReader("CopyN copies n bytes (or until an error) from src to dst. " +
  2. "It returns the number of bytes copied and " +
  3. "the earliest error encountered while copying.")
  4. dst := new(strings.Builder)
  5. written, err := io.CopyN(dst, src, 58)
  6. if err != nil {
  7. fmt.Printf("error: %v\n", err)
  8. } else {
  9. fmt.Printf("Written(%d): %q\n", written, dst.String())
  10. }

io 包的设计原则

Go语言提倡使用小接口加接口组合的方式,来扩展程序的行为以及增加程序的灵活性

io.Reader 接口的扩展接口

  • io.ReadWriter (io.Reader 和 io.Writer的组合)
  • io.ReadCloser (io.Reader 和 io.Closer的组合)
  • io.ReadWriteCloser (io.Reader、io.Writer 和io.Closer 三个接口的组合)
  • io.ReadSeeker (io.Reader 和 io.Seeker 的组合)
  • io.ReadWriteSeeker (io.Reader 、io.Writer 和 io.Seeker 的组合)

io.Reader 接口的实现类型

  • *io.LimitedReader
  • *io.SectionReader
  • *io.teeReader
  • *io.multiReader
  • *io.pipe

io 包中核心接口

  • io.Reader
  • io.Writer
  • io.Closer

io 包中接口的类型

  • 读取
  • 写入
  • 关闭
  • 读写位置的设定

几个读取接口的对比

  • io.ByteReader: 对应的读取方法 ReadByte(只能读取下一个字节)
  • io.ReadRune: 对应的读取方法 ReadRune (只能读取下一个 Unicode 字符)
  • strings.Reader: 是 io.ByteReader 的实现类型
  • bytes.Buffer: 是 io.RuneReader 的实现类型
  • io.Reader: 可以读取一串字符串