一、前言
也许对这两个接口和相关的一些接口很熟悉了,但是你脑海里确很难形成一个对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标准库还html" target="_blank">定义了一些由上面的单一职能的接口组合而成的接口。
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的详解与实现的全部内容,希望这篇文章的内容对大家的学习和工作能有所帮助,如果有疑问可以留言交流。
问题内容: 我正在编写一个长期运行的任务,该任务多次从mongodb(使用mgo)获取。然后使用此模块将其写入xlsx文件。然后使用重新读取,然后将其存储到我的ftp服务器中。 函数会消耗大量内存,因此,我认为应该有一种方法不保存文件,而是将数据从xlsx.Write直接传递到ftp.Store。(如果我可以同时进行流传输,那将是完美的,因为在将它们发送到Stor函数之前,不必将所有文档都保留在服
本文向大家介绍Go语言method详解,包括了Go语言method详解的使用技巧和注意事项,需要的朋友参考一下 前面两章我们介绍了函数和struct,那你是否想过函数当作struct的字段一样来处理呢?今天我们就讲解一下函数的另一种形态,带有接收者的函数,我们称为method method 现在假设有这么一个场景,你定义了一个struct叫做长方形,你现在想要计算他的面积,那么按照我们一般的思路应
本文向大家介绍Go语言interface详解,包括了Go语言interface详解的使用技巧和注意事项,需要的朋友参考一下 interface Go语言里面设计最精妙的应该算interface,它让面向对象,内容组织实现非常的方便,当你看完这一章,你就会被interface的巧妙设计所折服。 什么是interface 简单的说,interface是一组method的组合,我们通过interface
本文向大家介绍Go语言中new()和 make()的区别详解,包括了Go语言中new()和 make()的区别详解的使用技巧和注意事项,需要的朋友参考一下 概述 Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似。不过解释两者之间的不同也非常容易。 new 的主要特性 首先 new 是内建函数,你可以从 http://golang.org/pkg/builtin/#n
本文向大家介绍详解go语言的并发,包括了详解go语言的并发的使用技巧和注意事项,需要的朋友参考一下 1、启动go语言的协程 2、runtime.Goexit()方法。立即终止当前的协程 3、runtime.GOMAXPROCS()表示go使用几个cpu执行代码 4、管道定义和创建管道 5、管道的缓冲 6、关闭管道和接受关闭管道的信号 7、只读管道和只写管道和生产者和消费者模型 8、Timer定时器
本文向大家介绍详解Go语言中for range的"坑",包括了详解Go语言中for range的"坑"的使用技巧和注意事项,需要的朋友参考一下 前言 Go 中的for range组合可以和方便的实现对一个数组或切片进行遍历,但是在某些情况下使用for range时很可能就会被"坑",下面用一段代码来模拟下: 代码解析: 创建一个int slice,变量名为arr1并初始化 1,2,3 作为切片的值