在使用Go语言的过程中,无论你是实现web应用程序,还是控制台输入输出,又或者是网络操作,不可避免的会遇到IO操作,使用到io.Reader和io.Writer接口。也也许对这两个接口和相关的一些接口很熟悉了,但是你脑海里确很难形成一个对io接口的继承关系整天的概貌,原因在于godoc缺省并没有像javadoc一样显示官方库继承关系,这导致了我们对io接口的继承关系记忆不深,在使用的时候还经常需要翻文档加深记忆。本文试图梳理清楚Go io接口的继承关系,提供一个io接口的全貌。
io接口回顾
首先我们回顾一下几个常用的io接口。标准库的实现是将功能细分,每个最小粒度的功能定义成一个接口,然后接口可以组成成更多功能的接口。
最小粒度的接口
typeReaderinterface{ Read(p []byte) (nint, err error) }
typeWriterinterface{ Write(p []byte) (nint, err error) }
typeCloserinterface{ Close() error }
typeSeekerinterface{ Seek(offset int64, whenceint) (int64, error) }
typeReaderFrominterface{ ReadFrom(r Reader) (n int64, err error) }
typeWriterTointerface{ WriteTo(w Writer) (n int64, err error) }
typeReaderAtinterface{ ReadAt(p []byte, offint64) (nint, err error) }
typeWriterAtinterface{ WriteAt(p []byte, offint64) (nint, err error) }
typeByteReaderinterface{ ReadByte() (byte, error) }
typeByteWriterinterface{ WriteByte(c byte) error }
UnreadByte
typeByteScannerinterface{ ByteReader UnreadByte() error }
typeRuneReaderinterface{ ReadRune() (r rune, sizeint, err error) }
typeRuneScannerinterface{ RuneReader UnreadRune() error }
组合接口
Go标准库还定义了一些由上面的单一职能的接口组合而成的接口。
typeReadCloserinterface{ Reader Closer }
typeReadSeekerinterface{ Reader Seeker }
typeReadWriterinterface{ Reader Writer }
typeReadWriteCloserinterface{ Reader Writer Closer }
typeReadWriteSeekerinterface{ Reader Writer Seeker }
typeWriteCloserinterface{ Writer Closer }
typeWriteSeekerinterface{ Writer Seeker }
从它们的定义上可以看出,它们是最小粒度的组合。
最小接口的扩展
有些结构体struct实现并且扩展了接口,这些结构体是。