a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > 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的詳解與實現的全部內容,希望這篇文章的內容對大家的學習和工作能有所幫助,如果有疑問可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 精品无码久久久久国产 | 国产精品视频导航 | 国严精品久久久久久亚洲影视 | 久久久www成人免费精品 | 免费欧美 | 日韩欧美在线免费观看 | 久久久久中文 | 欧美日一区 | 成人看的免费视频 | 欧美视频三区 | 欧美成人一区二区三区片免费 | 欧美色综合天天久久综合精品 | 久久久精品一区二区 | 亚洲综合国产激情另类一区 | 久草电影网 | av一区二区三区四区 | 日韩精品视频免费在线观看 | av入口| 久久亚洲网 | 久久久一| 一区二区视频 | 五月激情天 | 成人免费淫片aa视频免费 | 国产一级免费视频 | 亚洲美女网站 | 精品视频一区二区 | 国产在线第一页 | 久久99国产精品久久99大师 | 久久网站免费视频 | 国产色在线 | 女十八免费毛片视频 | 国产精品久久久久久一区二区三区 | 国产精品久久久久久吹潮 | 中文字幕第15页 | 91久久久精品视频 | 综合网激情 | 草草影院浮力 | 玖草在线视频 | 最新日韩精品在线观看 | www.久久久 | 精品久久久久久久久久久久包黑料 |