Golang常用包使用介紹_第1頁
Golang常用包使用介紹_第2頁
Golang常用包使用介紹_第3頁
Golang常用包使用介紹_第4頁
Golang常用包使用介紹_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論