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

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

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

服務(wù)器之家 - 腳本之家 - Golang - Go語言中io包核心接口示例詳解

Go語言中io包核心接口示例詳解

2022-01-24 00:47漫漫Coding路 Golang

Go的io包提供了io.Reader和io.Writer接口,分別用于數(shù)據(jù)的輸入和輸出,下面這篇文章主要給大家介紹了關(guān)于Go語言中io包核心接口的相關(guān)資料,需要的朋友可以參考下

前言

IO 操作是我們?cè)诰幊讨胁豢杀苊鈺?huì)遇到的,例如讀寫文件,Go語言的 io 包中提供了相關(guān)的接口,定義了相應(yīng)的規(guī)范,不同的數(shù)據(jù)類型可以根據(jù)規(guī)范去實(shí)現(xiàn)相應(yīng)的方法,提供更加豐富的功能。

Go 語言提倡小接口 + 接口組合的方式,來擴(kuò)展程序的行為以及增加程序的靈活性。io代碼包恰恰就可以作為這樣的一個(gè)標(biāo)桿,它可以成為我們運(yùn)用這種技巧時(shí)的一個(gè)參考標(biāo)準(zhǔn)。io包中包含了大量接口,本篇文章我們就先來學(xué)習(xí)四個(gè)核心接口以及對(duì)應(yīng)的接口組合。

Reader

io.Reader接口定義了 Read 方法,用于讀取數(shù)據(jù)到字節(jié)數(shù)組中:

  • 入?yún)ⅲ鹤止?jié)數(shù)組 p,會(huì)將數(shù)據(jù)讀入到 p 中
  • 返回值:本次讀取的字節(jié)數(shù) n,以及遇到的錯(cuò)誤 err
?
1
2
3
type Reader interface {
    Read(p []byte) (n int, err error)
}

方法功能詳解

  1. 方法讀取數(shù)據(jù)寫入到字節(jié)數(shù)組 p 中,由于 p 是有大小的,所以一次至多讀取 len(p) 個(gè)字節(jié)
  2. 方法返回讀取的數(shù)據(jù)字節(jié)數(shù) n(0 <= n <= len(p)),以及讀取過程中遇到的 error
  3. 即使一次調(diào)用讀取到的數(shù)據(jù)小于 len(p),也可能會(huì)占用整個(gè)字節(jié)數(shù)組 p 作為暫存空間
  4. 如果數(shù)據(jù)源的數(shù)據(jù)量小于 len(p) 個(gè)字節(jié),方法只會(huì)讀取當(dāng)前可用數(shù)據(jù),不會(huì)等待更多數(shù)據(jù)的到來

何時(shí)返回error

  1. 在成功讀取了 n(n>0)個(gè)字節(jié)后,如果產(chǎn)生了 error 或者 讀到文件末尾 (end-of-file),本次調(diào)用必須要返回讀取的字節(jié)數(shù) n,但對(duì)于err 的值,可以選擇在本次直接返回 err(err!=nil),或者在下次調(diào)用的時(shí)候再返回 err (n=0, err!=nil)。常見的一個(gè)例子就是,讀取到n個(gè)字節(jié)后到達(dá)文件末尾(EOF),此時(shí)可以返回 err=EOF 或者 err=nil,下次調(diào)用返回 n=0,err=EOF。
  2. 調(diào)用者需要注意,每次調(diào)用后,如果 n>0,應(yīng)該先處理數(shù)據(jù),再考慮 err 是否為 nil。因?yàn)樯弦稽c(diǎn)已經(jīng)指出,如果讀取到 n>0 個(gè)字節(jié)后遇到 error,會(huì)同時(shí)返回 n>0 和 err!=nil,此時(shí)就需要先處理數(shù)據(jù)再考慮 err。

方法實(shí)現(xiàn)和調(diào)用需注意

  1. 如果想要實(shí)現(xiàn)該方法,不推薦同時(shí)返回 n=0 和 err=nil,除非 len(p)=0
  2. 如果調(diào)用該該方法返回 n=0 和 err=nil,可以認(rèn)為什么都沒有發(fā)生,不能認(rèn)為是讀到文件末尾了(end-of-file)
  3. 實(shí)現(xiàn)該方法后,一定不要持有字節(jié)數(shù)組p (保留下地址做他用)

Writer

io.Writer接口定義了 Write 方法,用于寫數(shù)據(jù)到文件中

  • 入?yún)ⅲ鹤止?jié)數(shù)組 p,會(huì)將 p 中的數(shù)據(jù)寫入到文件中
  • 返回值:成功寫入完成的字節(jié)數(shù) n,以及遇到的錯(cuò)誤 err
?
1
2
3
type Writer interface {
    Write(p []byte) (n int, err error)
}

方法功能詳解

  1. 該方法將 p 中的數(shù)據(jù)寫到文件中
  2. 方法返回成功寫入的字節(jié)數(shù) n(0 <= n <= len(p)),以及寫入過程中遇到的錯(cuò)誤 err
  3. 如果 n<len(p),方法必須返回 err!=nil
  4. 方法一定不能修改字節(jié)數(shù)組 p,即使是臨時(shí)修改也不被允許

方法實(shí)現(xiàn)需注意

實(shí)現(xiàn)該方法后,一定不要持有字節(jié)數(shù)組p,只是用來讀取數(shù)據(jù)

Closer

io.Closer接口定義了 Close 方法,該方法用于關(guān)閉連接。

方法實(shí)現(xiàn)需注意

第一次調(diào)用該方法后,再次調(diào)用該方法應(yīng)該產(chǎn)生什么行為,該接口沒有定義,依賴實(shí)現(xiàn)方法自定義。

?
1
2
3
type Closer interface {
    Close() error
}

Seeker

io.Seeker接口定義了 Seek 方法,該方法用于指定下次讀取或者寫入時(shí)的偏移量

入?yún)ⅲ河?jì)算新偏移量的起始值 whence, 基于whence的偏移量offset

返回值:基于 whence 和 offset 計(jì)算后新的偏移量值,以及可能產(chǎn)生的錯(cuò)誤

?
1
2
3
type Seeker interface {
    Seek(offset int64, whence int) (int64, error)
}

方法功能詳解

io包中定義了如下三種 whence

?
1
2
3
4
5
const (
    SeekStart   = 0 // 基于文件開始位置
    SeekCurrent = 1 // 基于當(dāng)前偏移量
    SeekEnd     = 2 // 基于文件結(jié)束位置
)

如果計(jì)算后新的偏移量,在文件起始位置之前,返回 error!=nil

任意正數(shù)的偏移量都是合法的,但是對(duì)數(shù)據(jù)源如何進(jìn)行I/O操作,依賴具體的實(shí)現(xiàn)方法

組合接口

在go語言中,可以利用接口的組合,來囊括其他接口中的方法,類似于定義了一個(gè)父接口,可以包含多個(gè)子接口。如果一個(gè) struct 實(shí)現(xiàn)了所有子接口的方法,也就相當(dāng)于實(shí)現(xiàn)了父接口。小接口 + 接口組合的方式,很大程度上增加了程序的靈活性,在我們自己業(yè)務(wù)開發(fā)過程中,可以借鑒這種做法。

針對(duì)上面四個(gè)最小粒度的接口,io包定義了如下幾種組合接口:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// ReadWriter 是 Read 和 Write 方法的組合
type ReadWriter interface {
    Reader
    Writer
}
 
// ReadCloser 是 Read 和 Close 方法的組合
type ReadCloser interface {
    Reader
    Closer
}
 
// WriteCloser 是 Write 和 Close 方法的組合
type WriteCloser interface {
    Writer
    Closer
}
 
// ReadWriteCloser 是 Read、Write 和 Close 方法的組合
type ReadWriteCloser interface {
    Reader
    Writer
    Closer
}
 
// ReadSeeker 是 Read 和 Seek 方法的組合
type ReadSeeker interface {
    Reader
    Seeker
}
 
// WriteSeeker 是 Write 和 Seek 方法的組合
type WriteSeeker interface {
    Writer
    Seeker
}
 
// ReadWriteSeeker 是 Read、Write 和 Seek 方法的組合
type ReadWriteSeeker interface {
    Reader
    Writer
    Seeker
}

總結(jié)

本篇文章介紹了 io包 中的四大核心接口:

  • Reader : 讀取文件中的數(shù)據(jù)到字節(jié)數(shù)組中
  • Writer : 將字節(jié)數(shù)組的數(shù)據(jù)寫入到文件中
  • Closer : 用于關(guān)閉連接
  • Seeker : 給定 whence 和 offset,計(jì)算得出新的offset,用于在特定位置開始讀寫

可以看到 Reader 和 Writer 接口中定義的方法中,都有字節(jié)數(shù)組p,而底層要操作的文件在方法中都沒有體現(xiàn)。Read方法是將文件的數(shù)據(jù)讀入字節(jié)數(shù)組p,Write 是將字節(jié)數(shù)組p的數(shù)據(jù)寫入文件,這一點(diǎn)不要記混。

到此這篇關(guān)于Go語言中io包核心接口的文章就介紹到這了,更多相關(guān)Go語言io包核心接口內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://juejin.cn/post/7041579897818447903

延伸 · 閱讀

精彩推薦
  • Golanggolang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

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

    李浩的life12792020-05-27
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

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

    腳本之家3642020-04-25
  • GolangGolang中Bit數(shù)組的實(shí)現(xiàn)方式

    Golang中Bit數(shù)組的實(shí)現(xiàn)方式

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

    天易獨(dú)尊11682021-06-09
  • Golanggolang 通過ssh代理連接mysql的操作

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

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

    a165861639710342021-03-08
  • Golanggo日志系統(tǒng)logrus顯示文件和行號(hào)的操作

    go日志系統(tǒng)logrus顯示文件和行號(hào)的操作

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

    SmallQinYan12302021-02-02
  • GolangGolang通脈之?dāng)?shù)據(jù)類型詳情

    Golang通脈之?dāng)?shù)據(jù)類型詳情

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

    4272021-11-24
  • Golanggolang的httpserver優(yōu)雅重啟方法詳解

    golang的httpserver優(yōu)雅重啟方法詳解

    這篇文章主要給大家介紹了關(guān)于golang的httpserver優(yōu)雅重啟的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,...

    helight2992020-05-14
  • Golanggolang如何使用struct的tag屬性的詳細(xì)介紹

    golang如何使用struct的tag屬性的詳細(xì)介紹

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

    Go語言中文網(wǎng)11352020-05-21
主站蜘蛛池模板: 亚洲国产经典 | 亚洲 欧美 中文 日韩 视频 | 精品福利一区 | chinese特色video| 欧美艳星kagney1ynn | 亚洲精品一区波多野结衣 | 黄+色+性+人免费 | 末代皇帝无删减版在线观看 | 青草香蕉精品视频在线观看 | yin娃sao货调教情趣用品店 | 亚洲国产精品嫩草影院永久 | 久久免费看少妇级毛片蜜臀 | 超强台风免费观看完整版视频 | 国产caoni555在线观看 | 色综色天天综合网 | 四虎影院在线免费播放 | 日本国产高清色www视频在线 | 日一日操一操 | 国产欧美日韩精品一区二区三区 | 果冻传媒在线播放1 | 小sao货水好多真紧h的视频 | 羞羞麻豆国产精品1区2区3区 | 偷偷狠狠的日日高清完整视频 | heyzo在线播放 | 特黄特色一级aa毛片免费观看 | 暖暖日本高清 | 久久99re2在线视频精品 | 波多野结衣不卡 | 草莓香蕉绿巨人丝瓜榴莲污在线观看 | 精品午夜寂寞影院在线观看 | 无人在线视频高清免费播放 | 精品一区二区三区在线视频观看 | 男人天堂999 | 免费日本视频 | japanese人妖xvideos | blacked亚裔videoshd| 狠狠色婷婷日日综合五月 | 视频在线观看大片 | 脱女学小内内摸出水网站免费 | pregnanthd产子 | 草女人逼 |