扣丁學(xué)堂區(qū)塊鏈GO語言開發(fā)之io包使用詳解
2018-09-07 14:31:53
1387瀏覽
今天扣丁學(xué)堂
區(qū)塊鏈培訓(xùn)老師給大家介紹一下關(guān)于Go語言中io包的使用,首先Go是谷歌2009發(fā)布的第二款編程語言。2009年7月份,谷歌曾發(fā)布了Simple語言,它是用來開發(fā)Android應(yīng)用它是用來開發(fā)Android應(yīng)用的一種BASIC語言。很多人喜歡Go語言,其實(shí)是因?yàn)镚o語言有其獨(dú)特的語言屬性在支撐著其在編程語言界的發(fā)展,下面我們一起來看一下吧。
io包為I/O原語提供了基礎(chǔ)的接口.它主要包裝了這些原語的已有實(shí)現(xiàn),如os包中的那些,抽象成函數(shù)性的共享公共接口,加上一些其它相關(guān)的原語,由于這些接口和原語以不同的實(shí)現(xiàn)包裝了低級操作,因此除非另行通知,否則客戶不應(yīng)假定它們對于并行執(zhí)行是安全的。
在io包中最重要的是兩個(gè)接口:Reader和Writer接口,首先來介紹這兩個(gè)接口:
type Reader interface {
Read(p byte) (n int,err error)
}
Reader接口包裝了基本的Read方法。
Read將len(p)個(gè)字節(jié)讀取到p中。它返回讀取的字節(jié)數(shù)n(當(dāng)Read在成功讀取n>0個(gè)字節(jié)后遇到一個(gè)錯(cuò)誤或EOF情況,它就會返回讀取的字節(jié)數(shù)。它會從相同的調(diào)用中返回(非nil的)錯(cuò)誤或從隨后的調(diào)用中返回錯(cuò)誤(和n==0)。這種一般情況的一個(gè)例子就是Reader在輸入流結(jié)束時(shí)會返回一個(gè)非零的字節(jié)數(shù),可能的返回不是err==EOF就是err==nil。無論如何,下一個(gè)Read都應(yīng)當(dāng)返回0,EOF。
調(diào)用者應(yīng)當(dāng)總在考慮到錯(cuò)誤err前處理n>0的字節(jié)。這樣做可以在讀取一些字節(jié),以及允許的EOF行為后正確地處理I/O錯(cuò)誤。
Read的實(shí)現(xiàn)會阻止返回零字節(jié)的計(jì)數(shù)和一個(gè)nil錯(cuò)誤,調(diào)用者應(yīng)將這種情況視作空操作。
type Writer interface {
Write(p byte) (n int, err error)
}
Writer接口包裝了基本的Write方法。
Write將len(p)個(gè)字節(jié)從p中寫入到基本數(shù)據(jù)流中。它返回從p中被寫入的字節(jié)數(shù)n(0
Io包中的函數(shù)(方法):
funcReadFull(rReader,bufbyte)(nint,errerror)
這個(gè)函數(shù)可以把對象r中的數(shù)據(jù)讀出來,然后存入一個(gè)緩沖區(qū)buf中,以便其它代碼可以處理buf中的數(shù)據(jù)。
這里有個(gè)問題,ReadFull函數(shù)究竟可以讀取哪些對象的數(shù)據(jù)?可以讀文件中的數(shù)據(jù)嗎?可以讀網(wǎng)絡(luò)中的數(shù)據(jù)嗎?可以讀數(shù)據(jù)庫中的數(shù)據(jù)嗎?可以讀磁盤中的扇區(qū)嗎?可以讀內(nèi)存中的數(shù)據(jù)嗎?
答案是ReadFull可以讀取任何對象的數(shù)據(jù),但是有個(gè)前提,就是這個(gè)對象必須符合Reader的標(biāo)準(zhǔn)。
Reader的標(biāo)準(zhǔn)是什么呢?下面是Reader的定義:
type Reader interface {
Read(p byte) (n int, err error)
}
從上面的定義可以看出,Reader的標(biāo)準(zhǔn)很簡單,只要某個(gè)對象實(shí)現(xiàn)了Read方法,這個(gè)對象就符合了Reader的標(biāo)準(zhǔn),就可以被ReadFull讀取。
太簡單了,只需要實(shí)現(xiàn)Read方法,不需要做其它任何事情。下面我們就來定義一個(gè)自己的類型,然后實(shí)現(xiàn)Read方法:
//定義一個(gè)Ustr類型(以string為基類型)
typeUstrstring
//實(shí)現(xiàn)Ustr類型的Read方法
func(sUstr)Read(pbyte)(nint,errerror){
i,ls,lp:=0,len(s),len(p)
for;i
//將小寫字母轉(zhuǎn)換為大寫字母,然后寫入p中
ifs[i]>='a'&&s[i]
p[i]=s[i]+'A'-'a'
}else{
p[i]=s[i]
}
}
//根據(jù)讀取的字節(jié)數(shù)設(shè)置返回值
switchi{
caselp:
returni,nil
casels:
returni,io.EOF
default:
returni,errors.New("ReadFail")
}
}
接下來,我們就可以用ReadFull方法讀取Ustr對象的數(shù)據(jù)了:
funcmain{
us:=Ustr("HelloWorld!")//創(chuàng)建Ustr對象us
buf:=make(byte,32)//創(chuàng)建緩沖區(qū)buf
n,err:=io.ReadFull(us,buf)//將us中的數(shù)據(jù)讀取到buf中
fmt.Printf("%s\n",buf)//顯示buf中的內(nèi)容
//HELLOWORLD!
fmt.Println(n,err)//顯示返回值
//12unexpectedEOF
}
我們很快就實(shí)現(xiàn)了Reader的要求,這個(gè)Reader就是一個(gè)接口,接口就是一個(gè)標(biāo)準(zhǔn),一個(gè)要求,一個(gè)規(guī)定,這個(gè)規(guī)定就是“要實(shí)現(xiàn)接口中的方法”。只要某個(gè)對象符合Reader接口的要求,那么這個(gè)對象就可以當(dāng)作Reader接口來使用,就可以傳遞給ReadFull方法。
所以,只要文件對象實(shí)現(xiàn)了Read方法,那么ReadFull就可以讀取文件中的數(shù)據(jù),只要網(wǎng)絡(luò)對象實(shí)現(xiàn)了Read方法,ReadFull就可以讀取網(wǎng)絡(luò)中的數(shù)據(jù),只要數(shù)據(jù)庫實(shí)現(xiàn)了Read方法,ReadFull就可以讀取數(shù)據(jù)庫中的數(shù)據(jù),只要磁盤對象實(shí)現(xiàn)了Read方法,ReadFull就可以讀磁盤中的數(shù)據(jù),只要內(nèi)存對象實(shí)現(xiàn)了Read方法,ReadFull就可以讀取內(nèi)存中的數(shù)據(jù),只要任何一個(gè)對象實(shí)現(xiàn)了Read方法,ReadFull就可以讀取該對象的數(shù)據(jù)。
以上就是關(guān)于扣丁學(xué)堂區(qū)塊鏈培訓(xùn)Go語言中io包使用的詳細(xì)介紹,希望容對大家學(xué)習(xí)區(qū)塊鏈開發(fā)有所幫助,想要了解更多關(guān)于區(qū)塊鏈方面內(nèi)容的小伙伴可以登錄扣丁學(xué)堂官網(wǎng)咨詢,此外扣丁學(xué)堂
區(qū)塊鏈視頻教程80%供學(xué)員免費(fèi)在線觀看,想要學(xué)習(xí)區(qū)塊鏈的小伙伴快到扣丁學(xué)堂報(bào)名吧。
【關(guān)注微信公眾號獲取更多學(xué)習(xí)資料】
查看更多關(guān)于“區(qū)塊鏈培訓(xùn)技術(shù)資訊”的相關(guān)文章>>
標(biāo)簽:
區(qū)塊鏈培訓(xùn)
區(qū)塊鏈技術(shù)
區(qū)塊鏈開發(fā)
區(qū)塊鏈視頻教程
比特幣
以太坊