一、前言
也许对这两个接口和相关的一些接口很熟悉了,但是你脑海里确很难形成一个对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的详解与实现的全部内容,希望这篇文章的内容对大家的学习和工作能有所帮助,如果有疑问可以留言交流。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]