1. IO 包

io包主要是定义了一堆interface,以及一些组合的interface,具体的实现还是其它的包完成的。

1.1. 变量信息

  1. 1. var EOF = errors.New("EOF")
  2. EOF当无法得到更多输入时,Read方法返回EOF,即正常读文件到结束
  3. 2. var ErrNoProgress = errors.New("multiple Read calls return no data or error")
  4. 某些使用io.Reader接口的客户端如果多次调用Read都不返回数据也不返回错误时,就会返回本错误.
  5. 一般来说是io.Reader的实现有问题的标志。
  6. 3. var ErrShortBuffer = errors.New("short buffer")
  7. ErrShortBuffer表示读取操作需要大缓冲,但提供的缓冲不够大。
  8. 4. var ErrShortWrite = errors.New("short write")
  9. ErrShortWrite表示写入操作写入的数据比提供的少,却没有显式的返回错误。
  10. 5. var ErrUnexpectedEOF = errors.New("unexpected EOF")
  11. ErrUnexpectedEOF表示在读取一个固定尺寸的块或者数据结构时,在读取未完全时遇到了EOF

1.2. 接口信息

io 包最核心的接口有三个:

  • 实现 Read() 方法的 Reader 接口,用于从读取内容
  • 实现 Write() 方法的 Writer 接口,用于写入内容
  • 实现 Close() 方法的 Closer 接口,用于关闭被打开的内容 ```
  1. type Reader interface { Read(p []byte) (n int, err error) } Reader接口用于包装基本的读取方法。Read方法读取len(p)字节数据写入p。

  2. type Writer interface { Write(p []byte) (n int, err error) } Writer接口用于包装基本的写入方法。Write方法len(p) 字节数据从p写入底层的数据流。

  3. type Seeker interface { Seek(offset int64, whence int) (int64, error) } Seek方法设定下一次读写的位置:偏移量为offset,校准点由whence确定: 0表示相对于文件起始;1表示相对于当前位置;2表示相对于文件结尾。 Seek方法返回新的位置以及可能遇到的错误。

  4. type Closer interface { Close() error } Closer接口用于包装基本的关闭方法。

  5. type ByteReader interface { ReadByte() (c byte, err error) } ReadByte读取输入中的单个字节并返回。如果没有字节可读取,会返回错误。

  6. type RuneReader interface { ReadRune() (r rune, size int, err error) } ReadRune读取单个utf-8编码的字符,返回该字符和它的字节长度。如果没有有效的字符,会返回错误。

  7. type ReaderFrom interface { ReadFrom(r Reader) (n int64, err error) } ReadFrom方法从r读取数据直到EOF或者遇到错误。返回值n是读取的字节数,执行时遇到的错误(EOF除外)也会被返回。

  8. type WriterTo interface { WriteTo(w Writer) (n int64, err error) } WriteTo方法将数据写入w直到没有数据可以写入或者遇到错误。 返回值n是写入的字节数,执行时遇到的任何错误也会被返回。

  1. ```go
  2. // ReadWriter is the interface that groups the basic Read and Write methods.
  3. type ReadWriter interface {
  4. Reader
  5. Writer
  6. }
  7. // ReadCloser is the interface that groups the basic Read and Close methods.
  8. type ReadCloser interface {
  9. Reader
  10. Closer
  11. }
  12. // WriteCloser is the interface that groups the basic Write and Close methods.
  13. type WriteCloser interface {
  14. Writer
  15. Closer
  16. }
  17. // ReadWriteCloser is the interface that groups the basic Read, Write and Close methods.
  18. type ReadWriteCloser interface {
  19. Reader
  20. Writer
  21. Closer
  22. }
  23. // ReadSeeker is the interface that groups the basic Read and Seek methods.
  24. type ReadSeeker interface {
  25. Reader
  26. Seeker
  27. }
  28. // ReadSeekCloser is the interface that groups the basic Read, Seek and Close
  29. // methods.
  30. type ReadSeekCloser interface {
  31. Reader
  32. Seeker
  33. Closer
  34. }
  35. // WriteSeeker is the interface that groups the basic Write and Seek methods.
  36. type WriteSeeker interface {
  37. Writer
  38. Seeker
  39. }
  40. // ReadWriteSeeker is the interface that groups the basic Read, Write and Seek methods.
  41. type ReadWriteSeeker interface {
  42. Reader
  43. Writer
  44. Seeker
  45. }

1.3. 函数

对于实现了上述接口的包而言,可以使用以下函数进行一些便捷操作,比如从Copy,WriteString等。

  1. 1. func TeeReader(r Reader, w Writer) Reader
  2. TeeReader返回一个将其从r读取的数据写入wReader接口。所有通过该接口对r的读取都会执行对应的对w的写入。
  3. 没有内部的缓冲:写入必须在读取完成前完成。写入时遇到的任何错误都会作为读取错误返回。
  4. 2. func MultiReader(readers ...Reader) Reader
  5. MultiReader返回一个将提供的Reader在逻辑上串联起来的Reader接口。他们依次被读取。
  6. 当所有的输入流都读取完毕,Read才会返回EOF。如果readers中任一个返回了非nilEOF的错误,Read方法会返回该错误。
  7. 3. func Copy(dst Writer, src Reader) (written int64, err error)
  8. src的数据拷贝到dst,直到在src上到达EOF或发生错误。返回拷贝的字节数和遇到的第一个错误。
  9. 对成功的调用,返回值errnil而非EOF,因为Copy定义为从src读取直到EOF,它不会将读取到EOF视为应报告的错误。
  10. 4. func CopyN(dst Writer, src Reader, n int64) (written int64, err error)
  11. src拷贝n个字节数据到dst,直到在src上到达EOF或发生错误。
  12. 5. func ReadFull(r Reader, buf []byte) (n int, err error)
  13. ReadFullr精确地读取len(buf)字节数据填充进buf。函数返回写入的字节数和错误(如果没有读取足够的字节)。
  14. 只有没有读取到字节时才可能返回EOF;如果读取了有但不够的字节时遇到了EOF,函数会返回ErrUnexpectedEOF
  15. 只有返回值errnil时,返回值n才会等于len(buf)。
  16. 6. func WriteString(w Writer, s string) (n int, err error)
  17. WriteString函数将字符串s的内容写入w中。如果w已经实现了WriteString方法,函数会直接调用该方法。

1.2. ioutil包

  1. 1. func ReadAll(r io.Reader) ([]byte, error)
  2. ReadAllr读取数据直到EOF或遇到error,返回读取的数据和遇到的错误。成功的调用返回的errnil而非EOF
  3. 因为本函数定义为读取r直到EOF,它不会将读取返回的EOF视为应报告的错误
  4. 2. func ReadFile(filename string) ([]byte, error)
  5. ReadFile filename指定的文件中读取数据并返回文件的内容。成功的调用返回的errnil而非EOF
  6. 因为本函数定义为读取整个文件,它不会将读取返回的EOF视为应报告的错误
  7. 3. func WriteFile(filename string, data []byte, perm os.FileMode) error
  8. 函数向filename指定的文件中写入数据。如果文件不存在将按给出的权限创建文件,否则在写入数据之前清空文件。
  9. 4. func TempDir(dir, prefix string) (name string, err error)
  10. dir目录里创建一个新的、使用prfix作为前缀的临时文件夹,并返回文件夹的路径。
  11. 如果dir是空字符串,TempDir使用默认用于临时文件的目录(参见os.TempDir函数)。
  12. 不同程序同时调用该函数会创建不同的临时目录,调用本函数的程序有责任在不需要临时文件夹时摧毁它。
  13. 5. func TempFile(dir, prefix string) (f *os.File, err error)
  14. dir目录下创建一个新的、使用prefix为前缀的临时文件,以读写模式打开该文件并返回os.File指针。
  15. 如果dir是空字符串,TempFile使用默认用于临时文件的目录(参见os.TempDir函数)。
  16. 不同程序同时调用该函数会创建不同的临时文件,调用本函数的程序有责任在不需要临时文件时摧毁它。
  17. 6. func ReadDir(dirname string) ([]os.FileInfo, error)
  18. 返回dirname指定的目录的目录信息的有序列表。