GO语言核心30讲 实战与应用 (第三部分)

发布于:2024-05-13 ⋅ 阅读:(161) ⋅ 点赞:(0)

 原站地址:Go语言核心36讲_Golang_Go语言-极客时间

一、io包中的接口和工具

1. strings.Builder、strings.Reader 和 bytes.Buffer 这些类型实现了 io 包的很多接口,目的是什么

    是为了提高不同程序实体之间的互操作性。 程序实体是指比如网络和文件。

    比如 io.Copy:  func Copy(dst Writer, src Reader) (written int64, err error)

    里面的 Writer 和 Reader 可以是网络,也可以是文件,只要实现了io.Reader接口和io.Writer接口就都可以了。可以把不同的实体抽象成一个统一的实体。

2. 扩展接口和实现类型的区别是什么?

   实现类型是一个结构体; 扩展接口只是通过结构体的方式,嵌入了其他数据类型,达到扩展原有数据类型功能的目的,

   扩展接口是多个接口的集合。要实现扩展接口,需要实现多个接口。

   实现类型是把接口实现了,而扩展接口并没有把接口实现,它只是多个接口的集合。

3. 在io包中,io.Reader的扩展接口实现类型都有哪些? (提升对io包的了解程度)

    io.Reader的扩展接口有下面几种:

(1) io.ReadWriter:包含字节序列读取方法Read,和写入方法Write。

(2) io.ReadCloser:包含字节序列读取方法Read,和关闭方法Close。Close用于关闭数据读写的通路。这个接口是io.Reader和io.Closer的组合。

(3) io.ReadWriteCloser:io.Reader、io.Write 和io.Closer的组合。

(4) io.ReadSeeker:可以根据给定的偏移量去寻找新的位置,作为下一次读的起始索引。包含了寻找读写位置的基本方法Seek。io.Reader 和io.Seeker的组合。

(5) io.ReadWriteSeeker:io.Reader、io.Writer和io.Seeker的组合。

   io.Reader接口的实现类型有下面几种:

(1) *io.LimitedReader:方法Read返回的总数据量会受到限制,无论被调用多少次。

(2) *io.SectionReader:Read方法只能够读取原始数据中的某一个部分。与切片类似,只暴露在窗口之中的数据。

(3) *io.teeReader:接受io.Reader和io.Writer两个类型的参数,把Reader读到的数据,通过字节切片中转的方式,写入io.Writer处。通常使用在数据流的处理中,比如计算下载速度。

(4) *io.multiReader:接受多个io.Reader类型的参数,并从中顺序地读取数据。

(5) *io.pipe:同步内存管道的核心实现

(6) * io.PipeReader:同步内存管道的读取端

4. io包中的接口都有哪些?

(1) 核心接口:io.Reader、io.Writer和io.Closer

(2) io.ByteReader:读取一个单一的字节。 strings.Reader和bytes.Buffer 是它的实现类型。

     io.RuneReader:读取一个单一的Unicode 字符。strings.Reader和bytes.Buffer 是其实现类型

     io.ByteScanner:读取和读回退单个字节

     io.RuneScanner:读取和读回退单个Unicode 字符

     io.ReaderAt:只读取数据,不修改已读计数的值。

     io.ReaderFrom:从一个 Reader 中读取数据

     io.WriteTo:将数据写入到一个 Writer 中

     io.ReadWriter:读和写, *io.pipe 是其实现类型。

     io.ReadWriteCloser:读写和关闭管道,net包有它的实现类型。

     io.ByteWriter和io.WriterAt:功能和上面对应。实现类型是 *os.File

     io.Seeker:寻找并设定下一次读取或写入时的起始索引位置。strings.Reader和io.SectionReader都是其实现类型。

    io.Closer:关闭管道。io.PipeReader和io.PipeWriter 是其实现类型。

(3) io包中的简单接口共有 11 个。读取操作相关的5 个,写入操作相关的 4 个,关闭操作有关的1 个,读写位置设定相关的一个。此外,还包含了 9 个基于这些简单接口的扩展接口。

二、bufio包中的数据类型

1. bufio 包的程序实体,是在包装简单 I/O 接口类型值的基础上,添加了缓冲区

2. bufio包中的数据类型主要有:(1) Reader (2) Scanner (3) Writer 和 ReadWriter。

3. bufio.Reader类型值中的缓冲区起着怎样的作用?

        Reader值会预先从底层读取器里读出一部分数据,暂存于缓冲区之中。当Reader值下次读取数据时,先从缓冲区中读取。 减少了底层读取器的使用次数,降低读取的执行时间。 

        虽然,读取时会增加填充缓冲区的操作,但从总体上看,平均执行时间会有大幅度的缩短。

4. bufio.Reader类型通过私有的 fill方法 来整理缓冲区,把已读的空间腾出来,提供给底层读取器存放数据。

    整理方法就是把 [已读计数, 已写计数) 范围内的数据往最前面搬运,如下图所示:

5. bufio.Reader类型读取方法分别有哪些?

(1) Peek方法:读取缓冲区中的n个未读字节,n大于缓冲区长度的话,转而直接从底层读取器中读出数据。

      会从已读计数代表的索引位置开始读,读完不更改已读计数。 

(2) Read方法:其他和Peek方法一样,但会更改已读计数。 

(3) ReadSlice方法:持续地读取数据,直至遇到调用方给定的分隔符为止。

     如果缓冲区满了仍然找不到分隔符,会把整个缓冲区作为第一个结果值,缓冲区已满错误作为第二个结果值 返回。

(4) ReadBytes方法: 其他和ReadSlice方法一样,但缓冲区满了仍然找不到分隔符的话,会再次调用ReadSlice方法,整理缓冲区之后继续从底层读取器中读出数据,直至少找到分隔符或者读完全部数据。

6. Peek方法、ReadSlice方法和ReadLine方法都有可能会造成内容泄露,因为他们都是返回直接基于缓冲区的字节切片。 只有Read方法不会内容泄露。


网站公告

今日签到

点亮在社区的每一天
去签到