国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

Go語言中io.Reader和io.Writer的詳解與實現

2020-04-01 19:08:51
字體:
來源:轉載
供稿:網友

一、前言

也許對這兩個接口和相關的一些接口很熟悉了,但是你腦海里確很難形成一個對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標準庫還定義了一些由上面的單一職能的接口組合而成的接口。

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) Readerfunc MultiReader(readers ...Reader) Readerfunc TeeReader(r Reader, w Writer) Readerfunc MultiWriter(writers ...Writer) Writer

三、繼承關系

當然,Go語言中并沒有Java中那樣的繼承關系,而是基于duck type形式實現,我用下圖嘗試展示Go io接口的繼承關系。

go,io.writer,io.reader,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.writer,io.reader,go語言io

四、總結

以上就是關于Go語言中io.Reader和io.Writer的詳解與實現的全部內容,希望這篇文章的內容對大家的學習和工作能有所幫助,如果有疑問可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 肃宁县| 丹巴县| 自治县| 武乡县| 凤庆县| 察哈| 中超| 班玛县| 永安市| 枣庄市| 修武县| 威信县| 贞丰县| 乌拉特前旗| 平南县| 绿春县| 红安县| 于都县| 呼玛县| 九寨沟县| 肇源县| 定安县| 宜州市| 普兰店市| 合川市| 饶平县| 晋城| 富平县| 江达县| 巴南区| 朝阳区| 太康县| 太保市| 横山县| 乳山市| 浦北县| 洛扎县| 渭南市| 闻喜县| 通榆县| 桂东县|