io包中的接口定义
- io包中提供了IO操作相关的一系列接口
- io包可以理解对os包中底层操作的封装
- 由于是对底层进行封装,除非特殊提及,否则io包下的函数是线程不安全的
Reader接口
- Reader接口只包含一个Read方法
- Read方法最多读取len(p)个字节到p中,返回读取到p中的字节数及过程中的错误
- Read方法读取过程中出错,会返回已经读取到的字节数
- Read出错的时候可以返回已经读取到的字节数和nil错误或者返回遇到的错误,而再下次调用Read方法的时候返回0, err即可
- Read方法的调用者需要先处理n>0的情况下的数据,而后考虑err的值,防止读取的数据丢失
- Read方法不鼓励返回0,nil样式的返回值,除非len(p) == 0
- p不能作为实现Reader接口的结构体的成员变量
|
|
Writer接口
- Writer接口只包含Write方法
- Write方法完成从p中写入len(p)个字节到数据流中,返回的是写入的字节数及遇到的错误
- Write方法如果返回的
n<len(p)
,则必须返回个非空的错误 - Write方法不允许调整p中的数据,临时调整也不可以
- p不能作为实现Writer接口的结构体的成员变量
|
|
Closer接口
- Closer接口只包含Close方法
- Closer接口返回关闭对象中遇到的错误
|
|
Seeker接口
- Seeker接口只含有一个Seek方法
- Seek方法根据whence的值计算出下一个读取或者写入的偏移量
- SeekStart对起始文件的偏移量
- SeekCurrent对当前索引的偏移量
- SeekEnd对结尾的偏移量
- Seek方法返回相对于起始位置的偏移量,和遇到的错误
- 实际上返回的偏移量小于文件的起始索引会产生错误
|
|
组合接口
- 对于上述的接口进行组合会产生一系列新的接口
|
|
ReaderFrom接口
- ReaderFrom接口只包含ReadFrom方法
- ReadFrom方法从r中读取数据直到遇到EOF或者error
- ReadFrom方法返回读取到的字节数和遇到的错误
- io.Copy函数会优先使用
|
|
WriteTo接口
- WriteTo接口只包含WriteTo方法
- WriteTo方法向w中写入数据,直到没有数据可以写入或者遇到了错误
- WriteTo方法返回写入的字节数和遇到的问题
- io.Copy函数会优先使用
|
|
ReaderAt接口
- ReaderAt接口只包含ReadAt方法
- ReadAt方法在实现的结构体的输入流中,在偏移量offset的位置读取len(p)个字节数据导p中
- ReadAt方法在读取到的字节小于len(p)时会返回一个非空错误来解释为什么没有读取完全,这个地方的要求比Reader接口更加严格
- ReadAt方法在调用过程中会占据p的全部内存空间,即使读取到的n小于p的长度
- ReadAt如果读取到的数据小于len(p),则ReadAt方法会等待更多的数据到来或者返回一个错误,这个地方要求也是比Reader更加严格
- ReadAt如果读取完最后一个数据之后,刚好读取了len(p)个字节,则可以返回的err为nil或者EOF
- ReadAt方法如果读取的是一个实现了Seek接口的结构体,那么ReadAt的offset和seek的offset不应该相互影响
- 读取的数据流可以支持多个ReadAt方法并发读取,也就是ReadAt是线程安全的
|
|
WriteAt接口
- WriterAt接口只包含WriteAt方法
- WriteAt方法完成向数据流的写入,写入的起点为输入流的offset位置
- WriteAt方法返回向数据流写入的数据和遇到的错误
- WriteAt方法当写入的数据小于len(p)时,返回的错误不能为nil
- WriteAt方法写入的数据流实现了Seek方法,则Seek方法的offset和WriteAt方法的offset互不影响
- 在数据流不溢出的情况下,WriteAt方法可以并发写入,是线程安全的
-
|
|
ByteReader接口
- ByteReader接口只包含ReadByte方法
- ReadByte方法读取一个字节,返回从input数据流中读取到的下一个字节或者遇到的错误
- 如果返回了一个错误,则input数据流没有字节被读取消费掉,并且返回的字节值为undefined
|
|
ByteScanner接口
- ByteScanner接口封装了ByteReader接口和UnreadByte方法
- UnreadByte方法在ReadByte方法之后调用,会重置ReadByte方法的操作
- 如果在没调用ReadByte方法时,调用UnreadByte方法会报错
|
|
ByteWriter接口
- ByteWriter接口只包含WriteByte方法
- WriteByte方法完成对数据流的字节写入
|
|
RuneReader接口
- RuneReader接口包含ReadRune方法
- Readrune方法从数据流中读取一个UTF-8编码的Unicode字符,返回读取到的字符,字符的大小和遇到的错误
|
|
RuneScanner接口
- RuneScanner接口封装了RuneReader接口和UnreadRune方法
- UnreadRune方法实际上是重置ReadRune方法的操作,需要在ReadRune方法之后调用
|
|
StringWriter接口
|
|
io包中的错误定义
|
|
io包中定义的结构体
LimitedReader
- LimitedReader读入数据到R中,限制读入的字节数为N
|
|
SectionReader
- SectionReader完成数据的部分读取
|
|
常用工具类方法
- WriteString函数将字符串s写入到w中
|
|
- ReadAtLeast函数从r中读取数据导buf中,同时规定了最少读取的字节数
|
|
- ReadFull一次性读取len(buf)个数到buf中,实际上是对ReadAtLeast的封装
|
|
- Copy方法完成将src的数据复制到dst中,直到遇到EOF或者错误
- Copy成功的话会返回nil,而不是EOF
- 如果src实现了WriteTo方法,则会优先调用,否则会调用dst的ReadFrom方法
|
|
- CopyBuffer和Copy是一致的,只是增加了缓冲区
|
|
- copyBuffer是实际上的Copy和CopyBuffer的实现
|
|
- CopyN完成从src复制N个字节数据到dst
|
|
ioutil中的工具类
ReadAll函数
- ReadAll函数将r中的数据读取出来并返回
- 成功读取返回的err为nil
- readAll函数实际上是利用bytes.Buffer完成数据的读取的
|
|
ReadFile函数
- ReadFile完成对指定文件的读取并且返回其数据
|
|
WriteFile函数
- WriteFile将数据写入到名称为filename的文件中
|
|
ReadDir函数
- ReadDir函数读取dirname下的文件或者路径并返回
|
|
NopCloser
- NopCloser返回带Close方法的Reader
|
|
Discard
- Discard的写入操作都会被忽略
|
|
Pipe函数
- Pipe在内存中创建了个管道,可以用于连接需要io.Reader和io.Writer的代码
- 读写会相互阻塞,除非一个写入被多次读取的场景存在
- Pipe是并发安全的
|
|
PipeReader和PipeWriter
- PipeReader是管道读的半边
|
|
- PipeWriter是管道写的半边
|
|
pipe结构体
- 实际上Pipe是对pipe的封装
|
|
- pipe实现了io.Reader接口
|
|
- pipe实现了io.Writer接口
|
|
- pipe的Close方法
|
|
multi
MultiReader 将多个Reader的内容写入p
|
|
MultiWriter 将p的内容写入多个数据流中
|
|