重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

Go语言中io.Reader和io.Writer的示例分析-创新互联

这篇文章给大家分享的是有关Go语言中io.Reader和io.Writer的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

西城ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!

一、前言

也许对这两个接口和相关的一些接口很熟悉了,但是你脑海里确很难形成一个对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接口的继承关系。

Go语言中io.Reader和io.Writer的示例分析

    其中黄色是 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.Reader和io.Writer的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站栏目:Go语言中io.Reader和io.Writer的示例分析-创新互联
转载来于:http://cqcxhl.com/article/csoeio.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP