1. IO 包
io包主要是定义了一堆interface,以及一些组合的interface,具体的实现还是其它的包完成的。
1.1. 变量信息
1. var EOF = errors.New("EOF")
EOF当无法得到更多输入时,Read方法返回EOF,即正常读文件到结束
2. var ErrNoProgress = errors.New("multiple Read calls return no data or error")
某些使用io.Reader接口的客户端如果多次调用Read都不返回数据也不返回错误时,就会返回本错误.
一般来说是io.Reader的实现有问题的标志。
3. var ErrShortBuffer = errors.New("short buffer")
ErrShortBuffer表示读取操作需要大缓冲,但提供的缓冲不够大。
4. var ErrShortWrite = errors.New("short write")
ErrShortWrite表示写入操作写入的数据比提供的少,却没有显式的返回错误。
5. var ErrUnexpectedEOF = errors.New("unexpected EOF")
ErrUnexpectedEOF表示在读取一个固定尺寸的块或者数据结构时,在读取未完全时遇到了EOF。
1.2. 接口信息
io 包最核心的接口有三个:
- 实现 Read() 方法的 Reader 接口,用于从读取内容
- 实现 Write() 方法的 Writer 接口,用于写入内容
- 实现 Close() 方法的 Closer 接口,用于关闭被打开的内容 ```
type Reader interface { Read(p []byte) (n int, err error) } Reader接口用于包装基本的读取方法。Read方法读取len(p)字节数据写入p。
type Writer interface { Write(p []byte) (n int, err error) } Writer接口用于包装基本的写入方法。Write方法len(p) 字节数据从p写入底层的数据流。
type Seeker interface { Seek(offset int64, whence int) (int64, error) } Seek方法设定下一次读写的位置:偏移量为offset,校准点由whence确定: 0表示相对于文件起始;1表示相对于当前位置;2表示相对于文件结尾。 Seek方法返回新的位置以及可能遇到的错误。
type Closer interface { Close() error } Closer接口用于包装基本的关闭方法。
type ByteReader interface { ReadByte() (c byte, err error) } ReadByte读取输入中的单个字节并返回。如果没有字节可读取,会返回错误。
type RuneReader interface { ReadRune() (r rune, size int, err error) } ReadRune读取单个utf-8编码的字符,返回该字符和它的字节长度。如果没有有效的字符,会返回错误。
type ReaderFrom interface { ReadFrom(r Reader) (n int64, err error) } ReadFrom方法从r读取数据直到EOF或者遇到错误。返回值n是读取的字节数,执行时遇到的错误(EOF除外)也会被返回。
type WriterTo interface { WriteTo(w Writer) (n int64, err error) } WriteTo方法将数据写入w直到没有数据可以写入或者遇到错误。 返回值n是写入的字节数,执行时遇到的任何错误也会被返回。
```go
// ReadWriter is the interface that groups the basic Read and Write methods.
type ReadWriter interface {
Reader
Writer
}
// ReadCloser is the interface that groups the basic Read and Close methods.
type ReadCloser interface {
Reader
Closer
}
// WriteCloser is the interface that groups the basic Write and Close methods.
type WriteCloser interface {
Writer
Closer
}
// ReadWriteCloser is the interface that groups the basic Read, Write and Close methods.
type ReadWriteCloser interface {
Reader
Writer
Closer
}
// ReadSeeker is the interface that groups the basic Read and Seek methods.
type ReadSeeker interface {
Reader
Seeker
}
// ReadSeekCloser is the interface that groups the basic Read, Seek and Close
// methods.
type ReadSeekCloser interface {
Reader
Seeker
Closer
}
// WriteSeeker is the interface that groups the basic Write and Seek methods.
type WriteSeeker interface {
Writer
Seeker
}
// ReadWriteSeeker is the interface that groups the basic Read, Write and Seek methods.
type ReadWriteSeeker interface {
Reader
Writer
Seeker
}
1.3. 函数
对于实现了上述接口的包而言,可以使用以下函数进行一些便捷操作,比如从Copy,WriteString等。
1. func TeeReader(r Reader, w Writer) Reader
TeeReader返回一个将其从r读取的数据写入w的Reader接口。所有通过该接口对r的读取都会执行对应的对w的写入。
没有内部的缓冲:写入必须在读取完成前完成。写入时遇到的任何错误都会作为读取错误返回。
2. func MultiReader(readers ...Reader) Reader
MultiReader返回一个将提供的Reader在逻辑上串联起来的Reader接口。他们依次被读取。
当所有的输入流都读取完毕,Read才会返回EOF。如果readers中任一个返回了非nil非EOF的错误,Read方法会返回该错误。
3. func Copy(dst Writer, src Reader) (written int64, err error)
将src的数据拷贝到dst,直到在src上到达EOF或发生错误。返回拷贝的字节数和遇到的第一个错误。
对成功的调用,返回值err为nil而非EOF,因为Copy定义为从src读取直到EOF,它不会将读取到EOF视为应报告的错误。
4. func CopyN(dst Writer, src Reader, n int64) (written int64, err error)
从src拷贝n个字节数据到dst,直到在src上到达EOF或发生错误。
5. func ReadFull(r Reader, buf []byte) (n int, err error)
ReadFull从r精确地读取len(buf)字节数据填充进buf。函数返回写入的字节数和错误(如果没有读取足够的字节)。
只有没有读取到字节时才可能返回EOF;如果读取了有但不够的字节时遇到了EOF,函数会返回ErrUnexpectedEOF。
只有返回值err为nil时,返回值n才会等于len(buf)。
6. func WriteString(w Writer, s string) (n int, err error)
WriteString函数将字符串s的内容写入w中。如果w已经实现了WriteString方法,函数会直接调用该方法。
1.2. ioutil包
1. func ReadAll(r io.Reader) ([]byte, error)
ReadAll从r读取数据直到EOF或遇到error,返回读取的数据和遇到的错误。成功的调用返回的err为nil而非EOF。
因为本函数定义为读取r直到EOF,它不会将读取返回的EOF视为应报告的错误
2. func ReadFile(filename string) ([]byte, error)
ReadFile 从filename指定的文件中读取数据并返回文件的内容。成功的调用返回的err为nil而非EOF。
因为本函数定义为读取整个文件,它不会将读取返回的EOF视为应报告的错误
3. func WriteFile(filename string, data []byte, perm os.FileMode) error
函数向filename指定的文件中写入数据。如果文件不存在将按给出的权限创建文件,否则在写入数据之前清空文件。
4. func TempDir(dir, prefix string) (name string, err error)
在dir目录里创建一个新的、使用prfix作为前缀的临时文件夹,并返回文件夹的路径。
如果dir是空字符串,TempDir使用默认用于临时文件的目录(参见os.TempDir函数)。
不同程序同时调用该函数会创建不同的临时目录,调用本函数的程序有责任在不需要临时文件夹时摧毁它。
5. func TempFile(dir, prefix string) (f *os.File, err error)
在dir目录下创建一个新的、使用prefix为前缀的临时文件,以读写模式打开该文件并返回os.File指针。
如果dir是空字符串,TempFile使用默认用于临时文件的目录(参见os.TempDir函数)。
不同程序同时调用该函数会创建不同的临时文件,调用本函数的程序有责任在不需要临时文件时摧毁它。
6. func ReadDir(dirname string) ([]os.FileInfo, error)
返回dirname指定的目录的目录信息的有序列表。