一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Golang - Go語言中io.Reader和io.Writer的詳解與實現

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

2020-05-01 13:00daisy Golang

在Go語言的實際編程中,幾乎所有的數據結構都圍繞接口展開,接口是Go語言中所有數據結構的核心。在使用Go語言的過程中,無論你是實現web應用程序,還是控制臺輸入輸出,又或者是網絡操作,不可避免的會遇到IO操作,使用到

一、前言

也許對這兩個接口和相關的一些接口很熟悉了,但是你腦海里確很難形成一個對io接口的繼承關系整天的概貌,原因在于godoc缺省并沒有像javadoc一樣顯示官方庫繼承關系,這導致了我們對io接口的繼承關系記憶不深,在使用的時候還經常需要翻文檔加深記憶。

本文試圖梳理清楚Go io接口的繼承關系,提供一個io接口的全貌。

二、io接口回顧

首先我們回顧一下幾個常用的io接口。標準庫的實現是將功能細分,每個最小粒度的功能定義成一個接口,然后接口可以組成成更多功能的接口。

最小粒度的接口

?
1
2
3
type Reader interface {
  Read(p []byte) (n int, err error)
}
?
1
2
3
type Writer interface {
  Write(p []byte) (n int, err error)
}
?
1
2
3
type Closer interface {
  Close() error
}
?
1
2
3
type Seeker interface {
  Seek(offset int64, whence int) (int64, error)
}
?
1
2
3
type ReaderFrom interface {
  ReadFrom(r Reader) (n int64, err error)
}
?
1
2
3
type WriterTo interface {
  WriteTo(w Writer) (n int64, err error)
}
?
1
2
3
type ReaderAt interface {
  ReadAt(p []byte, off int64) (n int, err error)
}
?
1
2
3
type WriterAt interface {
  WriteAt(p []byte, off int64) (n int, err error)
}

以及

?
1
2
3
type ByteReader interface {
  ReadByte() (byte, error)
}
?
1
2
3
type ByteWriter interface {
  WriteByte(c byte) error
}

ByteScanner比ByteReader多了一個UnreadByte方法。

?
1
2
3
4
type ByteScanner interface {
  ByteReader
  UnreadByte() error
}
?
1
2
3
type RuneReader interface {
  ReadRune() (r rune, size int, err error)
}
?
1
2
3
4
type RuneScanner interface {
  RuneReader
  UnreadRune() error
}

組合接口

Go標準庫還定義了一些由上面的單一職能的接口組合而成的接口。

?
1
2
3
4
type ReadCloser interface {
  Reader
  Closer
}
?
1
2
3
4
type ReadSeeker interface {
  Reader
  Seeker
}
?
1
2
3
4
type ReadWriter interface {
  Reader
  Writer
}
?
1
2
3
4
5
type ReadWriteCloser interface {
  Reader
  Writer
  Closer
}
?
1
2
3
4
5
type ReadWriteSeeker interface {
  Reader
  Writer
  Seeker
}
?
1
2
3
4
type WriteCloser interface {
  Writer
  Closer
}
?
1
2
3
4
type WriteSeeker interface {
  Writer
  Seeker
}

從它們的定義上可以看出,它們是最小粒度的組合。

最小接口的擴展

有些結構體struct實現并且擴展了接口,這些結構體是。

?
1
2
3
4
type LimitedReader struct {
  R Reader // underlying reader
  N int64 // max bytes remaining
}
?
1
2
3
type PipeReader struct {
  // contains filtered or unexported fields
}
?
1
2
3
type PipeWriter struct {
  // contains filtered or unexported fields
}
?
1
2
3
type SectionReader struct {
  // contains filtered or unexported fields
}

下面我會將它們的繼承關系畫出來。

一些輔助方法

一些輔助方法可以生成特殊類型的Reader或者Writer:

?
1
2
3
4
func LimitReader(r Reader, n int64) Reader
func MultiReader(readers ...Reader) Reader
func TeeReader(r Reader, w Writer) Reader
func MultiWriter(writers ...Writer) Writer

三、繼承關系

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

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

    其中黃色是 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.Reader和io.Writer的詳解與實現

四、總結

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

延伸 · 閱讀

精彩推薦
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
  • Golanggo日志系統logrus顯示文件和行號的操作

    go日志系統logrus顯示文件和行號的操作

    這篇文章主要介紹了go日志系統logrus顯示文件和行號的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    SmallQinYan12302021-02-02
  • GolangGolang中Bit數組的實現方式

    Golang中Bit數組的實現方式

    這篇文章主要介紹了Golang中Bit數組的實現方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    天易獨尊11682021-06-09
  • Golanggolang如何使用struct的tag屬性的詳細介紹

    golang如何使用struct的tag屬性的詳細介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細介紹,從例子說起,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看...

    Go語言中文網11352020-05-21
  • GolangGolang通脈之數據類型詳情

    Golang通脈之數據類型詳情

    這篇文章主要介紹了Golang通脈之數據類型,在編程語言中標識符就是定義的具有某種意義的詞,比如變量名、常量名、函數名等等,Go語言中標識符允許由...

    4272021-11-24
  • Golanggolang的httpserver優雅重啟方法詳解

    golang的httpserver優雅重啟方法詳解

    這篇文章主要給大家介紹了關于golang的httpserver優雅重啟的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,...

    helight2992020-05-14
  • Golanggolang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    a165861639710342021-03-08
  • Golanggolang json.Marshal 特殊html字符被轉義的解決方法

    golang json.Marshal 特殊html字符被轉義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉義的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    李浩的life12792020-05-27
主站蜘蛛池模板: 激情乱文 | 国产亚洲精品自在线亚洲情侣 | 香港日本三级亚洲三级 | 国产精品免费视频能看 | 国内久久精品视频 | 亚洲 欧美 制服 校园 动漫 | 男女男在线精品网站免费观看 | 波多野结衣 在线播放 | 男女男精品网站免费观看 | 手机看片福利盒子久久 | 欧美人妖另类性hd | 91网红福利精品区一区二 | 扒开腿开嫩苞 | 国产原创一区二区 | 亚洲视频在线免费看 | 亚洲国产精品无码中文字满 | 91桃色视频| 久久免费看少妇级毛片蜜臀 | 牛牛色婷婷在线视频播放 | 免费免费啪视频在线观播放 | 精品欧美日韩一区二区三区 | 放荡护士玩3p口述 | 欧美yyy| 亚洲欧美日韩中文字幕网址 | 门房秦大爷最新章节阅读 | 国产资源免费观看 | 亚洲美女aⅴ久久久91 | 草草影院免费 | ak福利影院 | 成人在线观看网站 | 55夜色66夜亚州精品站 | 国产精品一级视频 | 国产主播99 | 女同性互吃奶乳免费视频 | 热99精品| 欧美一区二区三区免费看 | 国产精品嫩草影院一二三区 | 99视频在线免费 | 成年人黄视频在线观看 | yellow在线 | 日本无卡码一区二区三区 |