• 很底层,为很多其他包提供服务
  • strings.Reader,返回的是Reader

go语言中,为了方便开发者使用,将IO操作封装在了如下几个包中:

  • io为IO原语(I/O primitives) 提供基本的接口(os File Reader Writer)
  • io/ioutil 封装一些实用的 I/O函数
  • fmt实现格式化/O,类似C语言中的printf和scanf
  • bufio实现带缓冲I/O(提高性能)

io-基本接口

reader接口

定义

io包input output--? - 图1

官方说明:

  • Read 将 len(p) 个字节读取到 p 中。它返回读取的字节数 n(0 <= n <= len(p)) 以及任何遇到的错误。 - Read只读不写 - 即使 Read 返回的 n < len(p),它也会在调用过程中占用 len(p) 个字节作为暂存空间。 - 若可读取的数据不到 len(p) 个字节,Read 会返回可用数据,而不是等待更多数据。(???,我想,意思就是,调用时,整体调用;返回时,按次读取)
  • 当 Read 在成功读取 n > 0 个字节后遇到一个错误或 EOF (end-of-file),它会返回读取的字节数。 - 它可能会同时在本次的调用中返回一个non-nil???错误,或在下一次的调用中返回这个错误(且 n 为 0)。 - 一般情况下, Reader会返回一个非0字节数n, 若 n = len(p) 个字节从输入源的结尾处由 Read 返回,Read可能返回 err == EOF 或者 err == nil。并且之后的 Read() 都应该返回 (n:0, err:EOF)。
  • 调用者在考虑错误之前应当首先处理返回的数据。这样做可以正确地处理在读取一些字节后产生的 I/O 错误,同时允许EOF的出现。

接口用法

Reader和Writer接口定义

io包最重要的是两个接口:Reader和Writer接口。本章所提到的各种IO包,都跟这两个接口有关,也就是说,只要实现了这两个接口,它就有了IO功能

  • reader接口定义
    io包input output--? - 图2
  • write接口定义
    io包input output--? - 图3

NOTE:

接口是类型,需要定义变量,才能使用;接口是方法集合,这里,一个接口只有一个方法,目的在约束变量???

哪些用到了Reader和Writer接口

  • os.File功能,同时实现了io.Reader和io.Writer
  • strings .Reader实现了io. Reader
    • 比如string.NewString返回Reader,其返回的变量,可以直接调用read方法
      io包input output--? - 图4
      结果是再次打印出了helllo world,这个过程无意义,只是为了凸显 r 是是什么样的变量
    • NewReader函数声明
      io包input output--? - 图5
  • bufio. Reader/Writer分别实现了io. Reader和io. Writer
  • 字节
    • bytes.Buffer同时实现了io. Reader和io. Writer
    • bytes . Reader实现了io. Reader
  • 压缩算法:
    compress/gzip. Reader/Writer分别实现了io.Reader 和io . Writer
  • 加密算法
    • crypto/cipher . StreamReader/SfreamWriter分别实现了i0. Reader和io. Writer
    • crypto/tls.Conn同时实现了io. Reader和io. Writer
  • 编码:
    encoding/csv Reader/Writer 分别实现了io.Reader 和io. Writer

io一看

  • 分成很多子包
  • 实例一览
    • copy