• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Go语言中io.Reader和io.Writer的详解与实现

    一、前言

    也许对这两个接口和相关的一些接口很熟悉了,但是你脑海里确很难形成一个对io接口的继承关系整天的概貌,原因在于godoc缺省并没有像javadoc一样显示官方库继承关系,这导致了我们对io接口的继承关系记忆不深,在使用的时候还经常需要翻文档加深记忆。

    本文试图梳理清楚Go io接口的继承关系,提供一个io接口的全貌。

    二、io接口回顾

    首先我们回顾一下几个常用的io接口。标准库的实现是将功能细分,每个最小粒度的功能定义成一个接口,然后接口可以组成成更多功能的接口。

    最小粒度的接口

    type Reader interface {
      Read(p []byte) (n int, err error)
    }
    type Writer interface {
      Write(p []byte) (n int, err error)
    }
    type Closer interface {
      Close() error
    }
    type Seeker interface {
      Seek(offset int64, whence int) (int64, error)
    }
    type ReaderFrom interface {
      ReadFrom(r Reader) (n int64, err error)
    }
    type WriterTo interface {
      WriteTo(w Writer) (n int64, err error)
    }
    type ReaderAt interface {
      ReadAt(p []byte, off int64) (n int, err error)
    }
    type WriterAt interface {
      WriteAt(p []byte, off int64) (n int, err error)
    }

    以及

    type ByteReader interface {
      ReadByte() (byte, error)
    }
    type ByteWriter interface {
      WriteByte(c byte) error
    }

    ByteScanner比ByteReader多了一个UnreadByte方法。

    type ByteScanner interface {
      ByteReader
      UnreadByte() error
    }
    type RuneReader interface {
      ReadRune() (r rune, size int, err error)
    }
    type RuneScanner interface {
      RuneReader
      UnreadRune() error
    }

    组合接口

    Go标准库还定义了一些由上面的单一职能的接口组合而成的接口。

    type ReadCloser interface {
      Reader
      Closer
    }
    type ReadSeeker interface {
      Reader
      Seeker
    }
    type ReadWriter interface {
      Reader
      Writer
    }
    type ReadWriteCloser interface {
      Reader
      Writer
      Closer
    }
    type ReadWriteSeeker interface {
      Reader
      Writer
      Seeker
    }
    type WriteCloser interface {
      Writer
      Closer
    }
    type WriteSeeker interface {
      Writer
      Seeker
    }

    从它们的定义上可以看出,它们是最小粒度的组合。

    最小接口的扩展

    有些结构体struct实现并且扩展了接口,这些结构体是。

    type LimitedReader struct {
      R Reader // underlying reader
      N int64 // max bytes remaining
    }
    type PipeReader struct {
      // contains filtered or unexported fields
    }
    type PipeWriter struct {
      // contains filtered or unexported fields
    }
    type SectionReader struct {
      // contains filtered or unexported fields
    }

    下面我会将它们的继承关系画出来。

    一些辅助方法

    一些辅助方法可以生成特殊类型的Reader或者Writer:

    func LimitReader(r Reader, n int64) Reader
    func MultiReader(readers ...Reader) Reader
    func TeeReader(r Reader, w Writer) Reader
    func MultiWriter(writers ...Writer) Writer

    三、继承关系

    当然,Go语言中并没有Java中那样的继承关系,而是基于duck type形式实现,我用下图尝试展示Go io接口的继承关系。

        其中黄色是 bufio 包下的类型,

        绿色是 archive.tar 包下的类型,

        蓝色是 bytes 包下的类型,

        粉红色是 strings包下的类型,

        紫色是 crypto.tls 包下的类型。

    Rand是math.rand包下的类型。

    File是os包下的内容。

    `Rand`左边的那个Reader是image.jpeg下的内容。

    我们最常用的是包io、bytes、bufio下的类型,所以这几个包下的类型要记牢,在第三库中经常会出现它们的身影。

    上图中并没有把mime/multipart.File和 net/http.File列出来,主要是图太复杂了,它们实现的接口和os.File类似。

    当然你可能会问,你怎么整理的它们的继承关系?事实上,你可以通过godoc -analysis=type -http=:6060生成带继承关系的Go doc,并且它还可以将你本地下载的库中的继承关系也显示出来。

    四、总结

    以上就是关于Go语言中io.Reader和io.Writer的详解与实现的全部内容,希望这篇文章的内容对大家的学习和工作能有所帮助,如果有疑问可以留言交流。

    您可能感兴趣的文章:
    • 深入解析Go语言的io.ioutil标准库使用
    • GO语言的IO方法实例小结
    • Go语言的IO库那么多纠结该如何选择
    上一篇:golang中make和new的区别示例详解
    下一篇:深入分析golang多值返回以及闭包的实现
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Go语言中io.Reader和io.Writer的详解与实现 语,言中,io.Reader,和,io.Writer,