io包提供了对I/O原语的基本接口。本包的基本任务是包装这些原语已有的实现(如os包里的原语),使之成为共享的公共接口,这些公共接口抽象出了泛用的函数并附加了一些相关的原语的操作。
io包中的源码都是BSD风格的。
1、io包中定义的error
// ErrShortWrite 当读取的字节不能满足需要的字节数时,就会返回该错误
var ErrShortWrite = errors.New("short write")
// errInvalidWrite 意味着返回一个不可能的字节数
var errInvalidWrite = errors.New("invalid write result")
// ErrShortBuffer 提供的缓冲区太小
var ErrShortBuffer = errors.New("short buffer")
// EOF当无法得到更多输入时,Read方法返回EOF。当函数一切正常的到达输入的结束时,就应返回EOF。
// 如果在一个结构化数据流中EOF在不期望的位置出现了,则应返回错误ErrUnexpectedEOF或者其它给出更多细节的错误。
var EOF = errors.New("EOF")
// ErrUnexpectedEOF 意味着EOF出现在了一个固定大小的块或者数据结构的中间位置
// 也就是文件没有读到结尾就出现了EOF
var ErrUnexpectedEOF = errors.New("unexpected EOF")
// 某些使用io.Reader接口的客户端如果多次调用Read都不返回数据也不返回错误时,就会返回本错误,
// 一般来说是io.Reader的实现有问题的标志。
var ErrNoProgress = errors.New("multiple Read calls return no data or error")
2、io包中的接口
2.1 Reader
Reader是一个包装了基本读方法的接口。
Read方法读取len§字节的数据到p中,它返回读取到的字节数和任何发生的错误。即使Read方法返回值n < len§,本方法在被调用时仍可能使用p的全部长度作为暂存空间。如果有部分可用数据,但不够len§字节,Read按惯例会返回可以读取到的数据,而不是等待更多数据。
Read 参数和返回值:
- p:缓冲区
- n:读取的字节数 0 <= n <= len§
- err:错误
type Reader interface {
Read(p []byte) (n int, err error)
}
2.2 Writer
Writer是一个包装了基本写方法的接口。
Write将len§个字节从p中写入底层数据流,返回写入的字节数和发生的任何导致写入提前停止的错误。如果写入的字节数小于len§它一定会返回一个非nil的错误。Writer一定不会修改传入的切片的数据。
type Writer interface {
Write(p []byte) (n int, err error)
}
2.3 Closer
Closer是一个包装了基本关闭方法的接口。例如:关闭文件。关闭socket
type Closer interface {
Close() error
}
2.4 Seeker
Seeker是一个包装了基本移位方法的接口。
Seek方法设定下一次读写的位置:偏移量为offset。Seek返回相对于文件的开始的新的偏移量和任何发生的错误。
type Seeker interface {
Seek(offset int64, whence int) (int64, error)
}
const (
SeekStart = 0 // 相对于文件开始位置
SeekCurrent = 1 // 相对于指针当前位置
SeekEnd = 2 // 相当于文件结尾的位置
)
2.5 ReaderFrom
ReadFrom从一个Reader中读取数据直到读完或者发生错误,返回值n为读取到的字节数。
type ReaderFrom interface {
ReadFrom(r Reader) (n int64, err error)
}
2.6 WriterTo
WriteTo向一个Writer中写入数据,直到数据全部写完或者发生错误。
type WriterTo interface {
WriteTo(w Writer) (n int64, err error)
}
2.7 ReaderAt
ReaderAt与Reader差不多,它可以指定读取的位置的偏移量。
type ReaderAt interface {
ReadAt(p []byte, off int64

本文解析了Go语言io包中的Error类型、关键接口(如Reader、Writer、Closer等)、常用函数(如ReadAtLeast、ReadFull等)以及重要结构体如LimitedReader。涵盖了基础I/O操作和错误处理的高级用法。
最低0.47元/天 解锁文章
3万+

被折叠的 条评论
为什么被折叠?



