回顾
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 类型
- 集读、写功能于一身的数据类型,非常适合作为字节序列的缓冲区
- 该指针类型实现的读取相关接口:
- io.Reader
- io.ByteReader
- io.RuneReader
- io.ByteScanner
- io.RuneScanner
- io.WriterTo
- 该指针类型实现的写入相关接口:
- io.Writer
- io.ByteWriter
- io.stringWriter
- io.ReaderFrom
io 包
io包中用于拷贝数据的函数:
- io.Copy
- io.CopyBuffer
- io.CopyN
以上函数会接收两个参数,即:用于代表数据的目的地、io.Writer类型的参数dst,以及用于代表数据来源的、io.Reader类型的参数src
src := strings.NewReader("CopyN copies n bytes (or until an error) from src to dst. " +
"It returns the number of bytes copied and " +
"the earliest error encountered while copying.")
dst := new(strings.Builder)
written, err := io.CopyN(dst, src, 58)
if err != nil {
fmt.Printf("error: %v\n", err)
} else {
fmt.Printf("Written(%d): %q\n", written, dst.String())
}
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: 可以读取一串字符串