一、io

1、两个接口

Go 的 io 包提供了 io.Readerio.Writer 接口,分别用于数据的输入和输出;

Go 官方提供了一些 API,支持对内存结构文件网络连接等资源进行操作;

围绕io.Reader/Writer,有几个常用的实现:

  • net.Conn, os.Stdin, os.File: 网络、标准输入输出、文件的流读取
  • strings.Reader: 把字符串抽象成Reader(类似流那样,这样就有各种API了)
  • bytes.Reader: 把[]byte抽象成Reader
  • bytes.Buffer: 把[]byte抽象成Reader和Writer
  • bufio.Reader/Writer: 抽象成带缓冲的流读取(比如按行读写)

什么是流?流是一种数据的载体,通过它可以实现数据交换和传输;
比如说程序读取文件,程序通过流从文件中读取数据,也通过向流中写入数据,最终写入到文件中;
代码中打开文件,就会返回一个流,这个流连通着文件和程序;

关于io.EOF

EOF是End-Of-File的缩写,表示输入流的结尾. 因为每个文件都有一个结尾;

2、io.Reader

该接口只有一个方法,Read(p []byte)。只要实现了 Read(p []byte) ,那它就是一个读取器。

3、io.Writer

该接口只有一个方法,Write(p []byte)。只要实现了 Write(p []byte) ,那它就是一个编写器。

4、辅助函数

5、PipeReader和PipeWriter

Pipe创建一个同步的内存中的管道,类型 io.PipeWriterio.PipeReader 在内存管道中模拟 io 操作。
数据被写入管道的一端,并使用单独的 goroutine 在管道的另一端读取。

6、特殊Reader

二、io_ioutil

1、ioutil

io 包下面的一个子包 ioutil 封装了一些非常方便的功能

2、函数

3、os.File

类型 os.File 表示本地系统上的文件。它实现了 io.Readerio.Writer ,因此可以在任何 io 上下文中使用。

4、os.Stdoutos.Stdinos.Stderr

这三者类型均为 *os.File,分别代表 系统标准输入系统标准输出系统标准错误 的文件句柄。

三、bufio

bufio 包实现了缓存IO。它包装了 io.Reader 和 io.Writer 对象,创建了另外的Reader和Writer对象,它们也实现了io.Reader和io.Writer接口,不过它们是有缓存的。
数据缓冲功能,能够一定程度减少大块数据读写带来的开销。

简单说就是,把文件读取进缓冲(内存)之后再读取的时候就可以避免文件系统的io 从而提高速度。

1、Reader 类型和方法

2、Writer

3、Scanner

Scanner是有缓存的,意思是Scanner底层维护了一个Slice用来保存已经从Reader中读取的数据;
Scanner本身不负责关闭文件描述符,需要自己在外面关闭;

这缓冲区是怎么样的?

四、bytes/strings

1、这两个包是相当类似的,只是一个操作[]byte,一个操作string罢了

2、功能:equal,container,ToLower,ToUpper,repeat(返回n个串联的字符串),replace,Trim,Split,Join(连接多个string)

3、bytes还拥有buff功能