Go語(yǔ)言的io輸入輸出流方式
Go語(yǔ)言的io輸入輸出流
Go語(yǔ)言的輸入輸出流不如其他語(yǔ)言那么直觀,由于是通過(guò)實(shí)現(xiàn)接口方法的隱式繼承所以比較抽象,今天具體介紹一下go語(yǔ)言的輸入輸出流。
go語(yǔ)言輸入輸出在io庫(kù)中
使用Reader
接口,如下:
type Reader interface { Read(p []byte) (n int, err error) }
Read方法從流中讀取長(zhǎng)度為len(p)
字節(jié)數(shù)據(jù)寫(xiě)入p。也就是使用Read
方法可以將流讀到p
中,從而從流中到程序中。
當(dāng)Read在讀取n > 0個(gè)字節(jié)后遭遇錯(cuò)誤或者到達(dá)文件結(jié)尾時(shí),會(huì)返回讀取的字節(jié)數(shù)。它可能會(huì)在該次調(diào)用返回一個(gè)非nil的錯(cuò)誤,或者在下一次調(diào)用時(shí)返回0和該錯(cuò)誤
io.Reader
是一個(gè)基本的接口,用于表示數(shù)據(jù)的讀取。它只有一個(gè)方法Read
。io.ReadFull
從 io.Reader 中精確讀取 len(buf) 字節(jié)的數(shù)據(jù)。
Writer
接口是寫(xiě)入流接口,如下:
type Writer interface { Write(p []byte) (n int, err error) }
Write
方法將len(p)
字節(jié)數(shù)據(jù)從p
寫(xiě)入底層的數(shù)據(jù)流。
它會(huì)返回寫(xiě)入的字節(jié)數(shù)(0 <= n <= len(p)
)和遇到的任何導(dǎo)致寫(xiě)入提取結(jié)束的錯(cuò)誤。Write必須返回非nil的錯(cuò)誤,如果它返回的 n < len(p)
。Write不能修改切片p中的數(shù)據(jù),即使臨時(shí)修改也不行。
io.Writer
是一個(gè)基本的接口,用于表示數(shù)據(jù)的寫(xiě)入。它只有一個(gè)方法Write
io.WriteString
向io.Writer
寫(xiě)入字符串。
流復(fù)制,從輸出流復(fù)制到輸出流,如下:
func Copy(dst Writer, src Reader) (written int64, err error)
上述只是輸入輸出流的基本用法
還有許多繼承類(lèi),如下:
os.File
同時(shí)實(shí)現(xiàn)了 io.Reader 和 io.Writerstrings.Reader
實(shí)現(xiàn)了 io.Readerbufio.Reader/Writer
分別實(shí)現(xiàn)了 io.Reader 和 io.Writerbytes.Buffer
同時(shí)實(shí)現(xiàn)了 io.Reader 和 io.Writerbytes.Reader
實(shí)現(xiàn)了 io.Readercompress/gzip.Reader/Writer
分別實(shí)現(xiàn)了 io.Reader 和 io.Writercrypto/cipher.StreamReader/StreamWriter
分別實(shí)現(xiàn)了 io.Reader 和 io.Writercrypto/tls.Conn
同時(shí)實(shí)現(xiàn)了 io.Reader 和 io.Writerencoding/csv.Reader/Writer
分別實(shí)現(xiàn)了 io.Reader 和 io.Writermime/multipart.Part
實(shí)現(xiàn)了 io.Readernet/conn
分別實(shí)現(xiàn)了 io.Reader 和 io.Writer(Conn接口定義了Read/Write)
上述包和結(jié)構(gòu)體都實(shí)現(xiàn)了io.Reader
方法,因此都可以使用Read
方法將流讀取到程序中。
常用的類(lèi)型有
os.File、strings.Reader、bufio.Reader/Writer、bytes.Buffer、bytes.Reader
可以看到直接獲取字節(jié)流的ReadFile
方法也是調(diào)用了Read
方法,如下:
在strings的也存在Reader接口,看源碼如下:
等等其他幾個(gè)接口也是如此,在未被封裝的時(shí)候都是調(diào)用Read
方法。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Golang語(yǔ)言JSON解碼函數(shù)Unmarshal的使用
本文主要介紹了Golang語(yǔ)言JSON解碼函數(shù)Unmarshal的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01go語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲的方法
這篇文章主要介紹了go語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲的方法,實(shí)例分析了Go語(yǔ)言流程判斷與處理的技巧,需要的朋友可以參考下2015-03-03詳解Golang函數(shù)式選項(xiàng)(Functional?Options)模式
什么是函數(shù)式選項(xiàng)模式,為什么要這么寫(xiě),這個(gè)編程模式解決了什么問(wèn)題呢?其實(shí)就是為了解決動(dòng)態(tài)靈活的配置不同的參數(shù)的問(wèn)題。下面通過(guò)本文給大家介紹Golang函數(shù)式選項(xiàng)(Functional?Options)模式的問(wèn)題,感興趣的朋友一起看看吧2021-12-12Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單留言板的方法
這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單留言板的方法,涉及數(shù)據(jù)庫(kù)、模板頁(yè)面元素等留言板相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02Golang unsafe包中的類(lèi)型和函數(shù)詳解
Golang中的unsafe包用于在運(yùn)行時(shí)進(jìn)行低級(jí)別的操作,這些操作通常是不安全的,因?yàn)榭梢源蚱艷olang的類(lèi)型安全性和內(nèi)存安全性,使用 unsafe包的程序可能會(huì)影響可移植性和兼容性,接下來(lái)看下unsafe包中的類(lèi)型和函數(shù)2023-08-08