這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
在使用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}
ByteScanner比ByteReader多了一個 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實現並且擴充了介面,這些結構體是。