




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第Golang常用包使用介紹目錄sync包鎖線程監(jiān)聽WaitGroup池Poolencoding/binary包單數(shù)值轉(zhuǎn)換多數(shù)值轉(zhuǎn)換encoding/gob包hash/crc32包
sync包
常用的有3個(gè)功能
鎖
鎖分為普通互斥鎖和讀寫鎖
互斥鎖Mutex讀寫鎖RWMutex一個(gè)線程未釋放鎖時(shí),其他線程加鎖阻塞讀鎖:一個(gè)線程未釋放讀鎖時(shí),其他線程可獲取讀鎖,獲取寫鎖阻塞
寫鎖:一個(gè)線程未釋放寫鎖時(shí),其他線程可獲取讀鎖或?qū)戞i都會(huì)阻塞
線程監(jiān)聽WaitGroup
使用場景:用于監(jiān)聽一組子線程是否執(zhí)行完畢
使用流程代碼建立監(jiān)聽對象wg:=new(sync.WaitGroup)創(chuàng)建多個(gè)子線程并計(jì)入計(jì)數(shù)器gofunc1(wg)
wg.Add(1)
gofunc2(wg)
wg.Add(1)線程子線程執(zhí)行完畢后,減少計(jì)數(shù)器值func1(wg){wg.Done()}監(jiān)聽計(jì)數(shù)器值,直到計(jì)數(shù)器值為0時(shí),執(zhí)行后面的代碼wg.Wait()
池Pool
用于存放每次請求都需要實(shí)例化,且生命周期較長的對象,以減輕垃圾回收壓力。
使用流程代碼建立一個(gè)池RequestPool=sync.Pool{New:func()interface{}{returnRequestHeader{}}}從池中取一個(gè)對象RequestPool.Get()把對象放回池中RequestPool.Put(RequestHeader)
把對象放入池之前,需要把對象中所有值都初始化
encoding/binary包
主要用來把數(shù)字轉(zhuǎn)換為字節(jié)類型
單數(shù)值轉(zhuǎn)換
//序列化
vardataAuint64=6010
varbufferbytes.Buffer
err1:=binary.Write(buffer,binary.BigEndian,dataA)
iferr1!=nil{
log.Panic(err1)
byteA:=buffer.Bytes()
fmt.Println("序列化后:",byteA)
//反序列化
vardataBuint64
varbyteB[]byte=byteA
err2:=binary.Read(bytes.NewReader(byteB),binary.BigEndian,dataB)
iferr2!=nil{
log.Panic(err2)
fmt.Println("反序列化后:",dataB)
其中的BigEndian和LittleEndian指定了轉(zhuǎn)換的方式是大端字節(jié)序,還是小端字節(jié)序。
所謂大端和小端節(jié)序,是指不同cpu再把數(shù)據(jù)流轉(zhuǎn)換為字節(jié)時(shí),排位位置的不同,如下
若不同計(jì)算機(jī)程序之間使用了不同節(jié)序處理同一組數(shù)據(jù),就會(huì)造成無法解析的情況
多數(shù)值轉(zhuǎn)換
指把多個(gè)數(shù)字轉(zhuǎn)換到一個(gè)byte切片中
首先定義一個(gè)定長切片s:=make([]byte,10)
首先要確定轉(zhuǎn)換的節(jié)序,也可以跳過該步驟
binary.LittleEndian.PutUint16(s,uint16(0))
確定完之后,就可以向s中插入數(shù)字了
start:=0
start+=binary.PutUvarint(b[2:],1198)
插入數(shù)字到切片后,會(huì)返回該數(shù)字在切片中占用的長度
若切片空間不夠,則返報(bào)錯(cuò)
所以我們最好確定往切片中插入數(shù)字的個(gè)數(shù),并估算每個(gè)數(shù)字占用最大占用長度
解析切片中的某個(gè)數(shù)字,要知道該數(shù)字在切片中占用的起始位置,若位置不對則無法解析出正確的數(shù)字,返回0
i,err:=binary.ReadUvarint(bytes.NewReader(b[2:]))
iferr==nil{
fmt.Println(i)
}else{
fmt.Println(err.Error())
切片中可以插入字符串,轉(zhuǎn)換為數(shù)字時(shí),只要能夠從正確的位置開始解析,就會(huì)解析出正確的數(shù)字
encoding/gob包
是一個(gè)golang專屬的數(shù)據(jù)序列化工具,用于序列化和反序列化數(shù)據(jù),作用類似于json
不同的是,在反序列化時(shí),需要有一個(gè)指定格式的變量接收值。該變量類型需要與序列化時(shí)數(shù)據(jù)類型兼容,否則反序列化失敗
typeSstruct{
Field1string
Field2int
funcmain(){
s1:=S{
Field1:"HelloGob",
Field2:999,
log.Println("Originalvalue:",s1)
buf:=new(bytes.Buffer)
err:=gob.NewEncoder(buf).Encode(s1)
iferr!=nil{
log.Println("Encode:",err)
return
s2:=S{}
err=gob.NewDecoder(buf).Decode(s2)
iferr!=nil{
log.Println("Decode:",err)
return
log.Println("Decodedvalue:",s2)
}
簡單的數(shù)據(jù)可以使用上面代碼直接加密和解密
但是當(dāng)需要解密的數(shù)據(jù)是接口類型時(shí),由于接口的特殊性,實(shí)現(xiàn)了接口中方法的變量可以作為值代替該方法,這導(dǎo)致gob不知道接口中數(shù)據(jù)的具體類型,會(huì)解密失敗,如下
typeGetterinterface{
Get()string
typeFoostruct{
Barstring
func(fFoo)Get()string{
returnf.Bar
buf:=bytes.NewBuffer(nil)
//創(chuàng)建一個(gè)接口變量
//接口中原值是一個(gè)get方法,因?yàn)镕oo實(shí)現(xiàn)了get方法,所以可以最為值代替Get
g:=Getter(Foo{"wazzup"})
//gob解密g時(shí),認(rèn)為g中的值是Get()類型,但其實(shí)是Foo類型,就會(huì)報(bào)錯(cuò)
enc:=gob.NewEncoder(buf)
enc.Encode(g)
解決這個(gè)問題的方法就是在代碼初始化時(shí),使用gob.Register()方法注冊Foo變量
當(dāng)gob解碼是發(fā)現(xiàn)類型不
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- XX醫(yī)療裝備企業(yè)2021-2023綠色發(fā)展報(bào)告:關(guān)愛員工構(gòu)建和諧職場
- 比亞迪2023上半年ESG實(shí)踐報(bào)告:監(jiān)管導(dǎo)向下的新能源汽車產(chǎn)業(yè)ESG發(fā)展
- 產(chǎn)品設(shè)計(jì)經(jīng)理崗位職責(zé)說明
- 小學(xué)數(shù)學(xué)優(yōu)困生促進(jìn)策略總結(jié)報(bào)告
- 高三數(shù)學(xué)函數(shù)專題輔導(dǎo)歸納總結(jié)
- 教師線上教學(xué)效果提升案例分析
- 工廠安全生產(chǎn)培訓(xùn)及事故應(yīng)急預(yù)案
- 股權(quán)代持協(xié)議法律風(fēng)險(xiǎn)及防范
- 全球變暖對棉花產(chǎn)量脅迫的時(shí)空分異特征與適應(yīng)策略研究
- 第22個(gè)安全教育日活動(dòng)總結(jié)范文
- 廚房消防安全培訓(xùn)
- 小陳 稅務(wù)風(fēng)險(xiǎn)應(yīng)對常見指標(biāo)與答復(fù)思路
- 2025年《中華人民共和國檔案法》知識培訓(xùn)試題及答案
- 2026年高考政治一輪復(fù)習(xí):必修2《經(jīng)濟(jì)與社會(huì)》知識點(diǎn)背誦提綱
- 2025至2030年中國建筑膜行業(yè)市場調(diào)查研究及發(fā)展趨勢預(yù)測報(bào)告
- 2025年急診急救試題(附答案)
- 變電站新員工培訓(xùn)課件
- 會(huì)所會(huì)議室管理制度
- 2025年北京市中考語文試卷(含答案與解析)
- 中科海光:2025年深算智能:海光DCU行業(yè)實(shí)戰(zhàn)手冊
- 信息服務(wù)費(fèi) 合同
評論
0/150
提交評論