Go語(yǔ)言中io.Reader和io.Writer的詳解與實(shí)現(xiàn)
一、前言
也許對(duì)這兩個(gè)接口和相關(guān)的一些接口很熟悉了,但是你腦海里確很難形成一個(gè)對(duì)io接口的繼承關(guān)系整天的概貌,原因在于godoc缺省并沒(méi)有像javadoc一樣顯示官方庫(kù)繼承關(guān)系,這導(dǎo)致了我們對(duì)io接口的繼承關(guān)系記憶不深,在使用的時(shí)候還經(jīng)常需要翻文檔加深記憶。
本文試圖梳理清楚Go io接口的繼承關(guān)系,提供一個(gè)io接口的全貌。
二、io接口回顧
首先我們回顧一下幾個(gè)常用的io接口。標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)是將功能細(xì)分,每個(gè)最小粒度的功能定義成一個(gè)接口,然后接口可以組成成更多功能的接口。
最小粒度的接口
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多了一個(gè)UnreadByte
方法。
type ByteScanner interface { ByteReader UnreadByte() error }
type RuneReader interface { ReadRune() (r rune, size int, err error) }
type RuneScanner interface { RuneReader UnreadRune() error }
組合接口
Go標(biāo)準(zhǔn)庫(kù)還定義了一些由上面的單一職能的接口組合而成的接口。
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 }
從它們的定義上可以看出,它們是最小粒度的組合。
最小接口的擴(kuò)展
有些結(jié)構(gòu)體struct實(shí)現(xiàn)并且擴(kuò)展了接口,這些結(jié)構(gòu)體是。
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 }
下面我會(huì)將它們的繼承關(guān)系畫出來(lái)。
一些輔助方法
一些輔助方法可以生成特殊類型的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
三、繼承關(guān)系
當(dāng)然,Go語(yǔ)言中并沒(méi)有Java中那樣的繼承關(guān)系,而是基于duck type形式實(shí)現(xiàn),我用下圖嘗試展示Go io接口的繼承關(guān)系。
其中黃色是 bufio 包下的類型,
綠色是 archive.tar 包下的類型,
藍(lán)色是 bytes 包下的類型,
粉紅色是 strings包下的類型,
紫色是 crypto.tls 包下的類型。
Rand是math.rand包下的類型。
File是os包下的內(nèi)容。
`Rand`左邊的那個(gè)Reader是image.jpeg下的內(nèi)容。
我們最常用的是包io、bytes、bufio下的類型,所以這幾個(gè)包下的類型要記牢,在第三庫(kù)中經(jīng)常會(huì)出現(xiàn)它們的身影。
上圖中并沒(méi)有把mime/multipart.File和 net/http.File列出來(lái),主要是圖太復(fù)雜了,它們實(shí)現(xiàn)的接口和os.File類似。
當(dāng)然你可能會(huì)問(wèn),你怎么整理的它們的繼承關(guān)系?事實(shí)上,你可以通過(guò)godoc -analysis=type -http=:6060生成帶繼承關(guān)系的Go doc,并且它還可以將你本地下載的庫(kù)中的繼承關(guān)系也顯示出來(lái)。
四、總結(jié)
以上就是關(guān)于Go語(yǔ)言中io.Reader和io.Writer的詳解與實(shí)現(xiàn)的全部?jī)?nèi)容,希望這篇文章的內(nèi)容對(duì)大家的學(xué)習(xí)和工作能有所幫助,如果有疑問(wèn)可以留言交流。
相關(guān)文章
Golang服務(wù)的請(qǐng)求調(diào)度的實(shí)現(xiàn)
Golang服務(wù)請(qǐng)求調(diào)度是一種使用Go語(yǔ)言實(shí)現(xiàn)的服務(wù)請(qǐng)求管理方法,本文主要介紹了Golang服務(wù)的請(qǐng)求調(diào)度的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08Qt6.5 grpc組件使用 + golang grpc server
這篇文章主要介紹了Qt6.5 grpc組件使用+golang grpc server示例,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05go開(kāi)源項(xiàng)目用戶名密碼驗(yàn)證的邏輯鬼才寫法
這篇文章主要為大家介紹了go開(kāi)源項(xiàng)目中發(fā)現(xiàn)的一個(gè)邏輯鬼才寫法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Golang中make與new使用區(qū)別小結(jié)
Go語(yǔ)言中new和make是內(nèi)建的兩個(gè)函數(shù),主要用來(lái)創(chuàng)建分配類型內(nèi)存,本文主要給大家介紹了Go語(yǔ)言中函數(shù)new與make的使用和區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01Golang?HTTP服務(wù)超時(shí)控制實(shí)現(xiàn)原理分析
這篇文章主要介紹了Golang?HTTP服務(wù)超時(shí)控制實(shí)現(xiàn)原理,HTTP服務(wù)的超時(shí)控制是保障服務(wù)高可用性的重要措施之一,由于HTTP服務(wù)可能會(huì)遇到網(wǎng)絡(luò)延遲,資源瓶頸等問(wèn)題,因此需要對(duì)請(qǐng)求進(jìn)行超時(shí)控制,以避免服務(wù)雪崩等問(wèn)題,需要的朋友可以參考下2023-05-05Windows環(huán)境下vscode-go安裝筆記(不支持32位)
這篇文章主要介紹了Windows環(huán)境下vscode-go安裝筆記(不支持32位),需要的朋友可以參考下2017-02-02golang中的string與其他格式數(shù)據(jù)的轉(zhuǎn)換方法詳解
這篇文章主要介紹了golang中的string與其他格式數(shù)據(jù)的轉(zhuǎn)換方法,文章通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-10-10go項(xiàng)目實(shí)現(xiàn)mysql接入及web?api的操作方法
這篇文章主要介紹了go項(xiàng)目實(shí)現(xiàn)mysql接入以及web api,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08