最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年12月16日 12:45:35   作者:漫漫Coding路  
Go的io包提供了io.Reader和io.Writer接口,分別用于數(shù)據(jù)的輸入和輸出,下面這篇文章主要給大家介紹了關(guān)于Go語言中io包核心接口的相關(guān)資料,需要的朋友可以參考下

前言

IO 操作是我們在編程中不可避免會遇到的,例如讀寫文件,Go語言的 io 包中提供了相關(guān)的接口,定義了相應(yīng)的規(guī)范,不同的數(shù)據(jù)類型可以根據(jù)規(guī)范去實現(xiàn)相應(yīng)的方法,提供更加豐富的功能。

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

Reader

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

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

方法功能詳解

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

何時返回error

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

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

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

Writer

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

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

方法功能詳解

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

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

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

Closer

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

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

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

type Closer interface {
	Close() error
}

Seeker

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

入?yún)ⅲ河嬎阈缕屏康钠鹗贾?whence, 基于whence的偏移量offset

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

type Seeker interface {
	Seek(offset int64, whence int) (int64, error)
}

方法功能詳解

io包中定義了如下三種 whence

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

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

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

組合接口

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

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

// 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,計算得出新的offset,用于在特定位置開始讀寫

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

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

相關(guān)文章

  • Go保證并發(fā)安全底層實現(xiàn)詳解

    Go保證并發(fā)安全底層實現(xiàn)詳解

    這篇文章主要為大家介紹了Go保證并發(fā)安全底層實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • linux中用shell快速安裝配置Go語言的開發(fā)環(huán)境

    linux中用shell快速安裝配置Go語言的開發(fā)環(huán)境

    相信每位開發(fā)者都知道選擇一門開發(fā)語言,免不了需要安裝配置開發(fā)環(huán)境,所以這篇文章給大家分享了linux下使用shell一鍵安裝配置GO語言開發(fā)環(huán)境的方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-10-10
  • go語言中基本數(shù)據(jù)類型及應(yīng)用快速了解

    go語言中基本數(shù)據(jù)類型及應(yīng)用快速了解

    這篇文章主要為大家介紹了go語言中基本數(shù)據(jù)類型應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Golang 編譯成DLL文件的操作

    Golang 編譯成DLL文件的操作

    這篇文章主要介紹了Golang 編譯成DLL文件的操作方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • golang使用jaeger進行鏈路追蹤

    golang使用jaeger進行鏈路追蹤

    鏈路追蹤是指在分布式系統(tǒng)中,將一次請求的處理過程進行記錄并聚合展示的一種方法,目的是將一次分布式請求的調(diào)用情況集中在一處展示,本文將介紹golang如何使用jaeger進行鏈路追蹤,需要的朋友可以參考下
    2024-06-06
  • go語言調(diào)用其他包中的函數(shù)簡單示例

    go語言調(diào)用其他包中的函數(shù)簡單示例

    這篇文章主要給大家介紹了關(guān)于go語言調(diào)用其他包中的函數(shù)的相關(guān)資料,文中還介紹了Go語言同一個包中不同文件之間函數(shù)調(diào)用的相關(guān)問題,需要的朋友可以參考下
    2023-01-01
  • golang接口實現(xiàn)調(diào)用修改(值接收者指針接收者)場景詳解

    golang接口實現(xiàn)調(diào)用修改(值接收者指針接收者)場景詳解

    這篇文章主要為大家介紹了golang接口實現(xiàn)調(diào)用修改值接收者指針接收者示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • 關(guān)于Golang中range指針數(shù)據(jù)的坑詳解

    關(guān)于Golang中range指針數(shù)據(jù)的坑詳解

    這篇文章主要給大家介紹了關(guān)于Golang中range指針數(shù)據(jù)的坑的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • go語言中slice,map,channl底層原理

    go語言中slice,map,channl底層原理

    這篇文章主要介紹了go語言中slice,map,channl底層原理,slice,map,channl是我們Go語言中最最常用的幾個數(shù)據(jù)結(jié)構(gòu),對于其更多相關(guān)內(nèi)容需要的小伙伴可以參考下面文章詳細內(nèi)容
    2022-06-06
  • golang 流式讀取和發(fā)送使用場景示例

    golang 流式讀取和發(fā)送使用場景示例

    這篇文章主要為大家介紹了golang 流式讀取和發(fā)送使用場景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12

最新評論

三明市| 扎兰屯市| 万安县| 沙河市| 林口县| 兴化市| 扬州市| 曲沃县| 邳州市| 万荣县| 深水埗区| 磐石市| 新绛县| 紫云| 江安县| 南乐县| 兴和县| 玛多县| 桐柏县| 安图县| 尼玛县| 无为县| 巴马| 天柱县| 诸城市| 林甸县| 黄龙县| 广州市| 乌兰察布市| 云梦县| 馆陶县| 泸水县| 稷山县| 巴东县| 墨玉县| 东乡县| 宕昌县| 偃师市| 韩城市| 繁峙县| 五大连池市|