一、前言
也许对这两个接口和相关的一些接口很熟悉了,但是你脑海里确很难形成一个对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的详解与实现的全部内容,希望这篇文章的内容对大家的学习和工作能有所帮助,如果有疑问可以留言交流。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
更新日志
- 黄乙玲1988-无稳定的爱心肝乱糟糟[日本东芝1M版][WAV+CUE]
- 群星《我们的歌第六季 第3期》[320K/MP3][70.68MB]
- 群星《我们的歌第六季 第3期》[FLAC/分轨][369.48MB]
- 群星《燃!沙排少女 影视原声带》[320K/MP3][175.61MB]
- 乱斗海盗瞎6胜卡组推荐一览 深暗领域乱斗海盗瞎卡组分享
- 炉石传说乱斗6胜卡组分享一览 深暗领域乱斗6胜卡组代码推荐
- 炉石传说乱斗本周卡组合集 乱斗模式卡组最新推荐
- 佟妍.2015-七窍玲珑心【万马旦】【WAV+CUE】
- 叶振棠陈晓慧.1986-龙的心·俘虏你(2006复黑限量版)【永恒】【WAV+CUE】
- 陈慧琳.1998-爱我不爱(国)【福茂】【WAV+CUE】
- 咪咕快游豪礼放送,百元京东卡、海量欢乐豆就在咪咕咪粉节!
- 双11百吋大屏焕新“热”,海信AI画质电视成最大赢家
- 海信电视E8N Ultra:真正的百吋,不止是大!
- 曾庆瑜1990-曾庆瑜历年精选[派森][WAV+CUE]
- 叶玉卿1999-深情之选[飞图][WAV+CUE]