在使用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实现并且扩展了接口,这些结构体是。