亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang常用包使用介紹

 更新時間:2022年09月14日 09:30:13   作者:whynogome  
標(biāo)準(zhǔn)的Go語言代碼庫中包含了大量的包,并且在安裝Go的時候多數(shù)會自動安裝到系統(tǒng)中。我們可以在$GOROOT/src/pkg目錄中查看這些包。下面簡單介紹一些我們開發(fā)中常用的包

sync包

常用的有3個功能

鎖分為普通互斥鎖和讀寫鎖

互斥鎖 Mutex讀寫鎖 RWMutex
一個線程未釋放鎖時,其他線程加鎖阻塞讀鎖:一個線程未釋放讀鎖時,其他線程可獲取讀鎖,獲取寫鎖阻塞
寫鎖:一個線程未釋放寫鎖時,其他線程可獲取讀鎖或?qū)戞i都會阻塞

線程監(jiān)聽WaitGroup

使用場景:用于監(jiān)聽一組子線程是否執(zhí)行完畢

使用流程代碼
建立監(jiān)聽對象wg := new(sync.WaitGroup)
創(chuàng)建多個子線程并計(jì)入計(jì)數(shù)器go func1(wg)
wg.Add(1)
go func2(wg)
wg.Add(1)
線程子線程執(zhí)行完畢后,減少計(jì)數(shù)器值func1(wg){wg.Done()}
監(jiān)聽計(jì)數(shù)器值,直到計(jì)數(shù)器值為0時,執(zhí)行后面的代碼wg.Wait()

池Pool

用于存放每次請求都需要實(shí)例化,且生命周期較長的對象,以減輕垃圾回收壓力。

使用流程代碼
建立一個池RequestPool = sync.Pool{New: func() interface{} {return &RequestHeader{}}}
從池中取一個對象RequestPool .Get()
把對象放回池中RequestPool .Put(RequestHeader)
把對象放入池之前,需要把對象中所有值都初始化

encoding/binary包

主要用來把數(shù)字轉(zhuǎn)換為字節(jié)類型

單數(shù)值轉(zhuǎn)換

//序列化
    var dataA uint64=6010
    var buffer bytes.Buffer
    err1 := binary.Write(&buffer, binary.BigEndian, &dataA)
    if err1!=nil{
        log.Panic(err1)
    }
    byteA:=buffer.Bytes()
    fmt.Println("序列化后:",byteA)
    //反序列化
    var dataB uint64
    var byteB []byte=byteA
    err2:=binary.Read(bytes.NewReader(byteB),binary.BigEndian,&dataB)
    if err2!=nil{
        log.Panic(err2)
    }
    fmt.Println("反序列化后:",dataB)

其中的BigEndian和LittleEndian 指定了轉(zhuǎn)換的方式是 大端字節(jié)序,還是小端字節(jié)序。

所謂大端和小端節(jié)序,是指不同cpu再把數(shù)據(jù)流轉(zhuǎn)換為字節(jié)時,排位位置的不同,如下

若不同計(jì)算機(jī)程序之間使用了不同節(jié)序處理同一組數(shù)據(jù),就會造成無法解析的情況

多數(shù)值轉(zhuǎn)換

指把多個數(shù)字轉(zhuǎn)換到一個byte切片中

首先定義一個定長切片 s := make([]byte,10)

首先要確定轉(zhuǎn)換的節(jié)序,也可以跳過該步驟

binary.LittleEndian.PutUint16(s, uint16(0))

確定完之后,就可以向s中插入數(shù)字了

start := 0
start += binary.PutUvarint(b[2:], 1198)

插入數(shù)字到切片后,會返回該數(shù)字在切片中占用的長度

若切片空間不夠,則返報(bào)錯

所以我們最好確定往切片中插入數(shù)字的個數(shù),并估算每個數(shù)字占用最大占用長度

解析切片中的某個數(shù)字,要知道該數(shù)字在切片中占用的起始位置,若位置不對則無法解析出正確的數(shù)字,返回0

i,err := binary.ReadUvarint(bytes.NewReader(b[2:]))
if err==nil{
   fmt.Println(i)
}else{
   fmt.Println(err.Error())
} 		

切片中可以插入字符串,轉(zhuǎn)換為數(shù)字時,只要能夠從正確的位置開始解析,就會解析出正確的數(shù)字

encoding/gob包

是一個golang專屬的數(shù)據(jù)序列化工具,用于序列化和反序列化數(shù)據(jù),作用類似于json

不同的是,在反序列化時,需要有一個指定格式的變量接收值。該變量類型需要與序列化時數(shù)據(jù)類型兼容,否則反序列化失敗

	type S struct{
		Field1 string
		Field2 int
    }
	func main() {
		s1 := &S{
			Field1: "Hello Gob",
			Field2: 999,
		}
		log.Println("Original value:", s1)
		buf := new(bytes.Buffer)
		err := gob.NewEncoder(buf).Encode(s1)
		if err != nil {
			log.Println("Encode:", err)
			return
		}
		s2 := &S{}
		err = gob.NewDecoder(buf).Decode(s2)
		if err != nil {
			log.Println("Decode:", err)
			return
		}
		log.Println("Decoded value:", s2)
	}

簡單的數(shù)據(jù)可以使用上面代碼直接加密和解密

但是當(dāng)需要解密的數(shù)據(jù)是接口類型時,由于接口的特殊性,實(shí)現(xiàn)了接口中方法的變量可以作為值代替該方法,這導(dǎo)致gob不知道接口中數(shù)據(jù)的具體類型,會解密失敗,如下

type Getter interface {
    Get() string
}
type Foo struct {
    Bar string
}
func (f Foo)Get() string {
    return f.Bar
}
buf := bytes.NewBuffer(nil)
// 創(chuàng)建一個接口變量
//接口中原值是一個get方法,因?yàn)镕oo實(shí)現(xiàn)了get方法,所以可以最為值代替Get
g := Getter(Foo{"wazzup"})
// gob解密g時,認(rèn)為g中的值是Get() 類型,但其實(shí)是Foo類型,就會報(bào)錯
enc := gob.NewEncoder(buf)
enc.Encode(&g)

解決這個問題的方法就是在代碼初始化時,使用 gob.Register()方法注冊Foo變量

當(dāng)gob解碼是發(fā)現(xiàn)類型不對應(yīng),會從已注冊的類型中查找

hash/crc32包

常用方法:

func ChecksumIEEE(data []byte) uint32

返回?cái)?shù)據(jù)data使用IEEE多項(xiàng)式計(jì)算出的CRC-32校驗(yàn)和

可通過對比數(shù)據(jù)發(fā)送和接收時的校驗(yàn)和,驗(yàn)證數(shù)據(jù)是否被篡改

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

相關(guān)文章

  • 揭秘Go Json.Unmarshal精度丟失之謎

    揭秘Go Json.Unmarshal精度丟失之謎

    我們知道在json反序列化時是沒有整型和浮點(diǎn)型的區(qū)別,數(shù)字都使用同一種類型,在go語言的類型中這種共同類型就是float64,下面我們就來探討一下Json.Unmarshal精度丟失之謎吧
    2023-08-08
  • golang原生實(shí)現(xiàn)JWT的示例代碼

    golang原生實(shí)現(xiàn)JWT的示例代碼

    在Go中實(shí)現(xiàn)JWT驗(yàn)證,可以通過標(biāo)準(zhǔn)庫crypto/hmac、crypto/sha256和encoding/base64來編寫自己的JWT,本文就詳細(xì)的來介紹一下,感興趣的可以了解下
    2023-05-05
  • GO中的時間操作總結(jié)(time&dateparse)

    GO中的時間操作總結(jié)(time&dateparse)

    日常開發(fā)過程中,對于時間的操作可謂是無處不在,但是想實(shí)現(xiàn)時間自由還是不簡單的,多種時間格式容易混淆,本文為大家整理了一下GO中的時間操作,有需要的可以參考下
    2023-09-09
  • 淺談Go數(shù)組比切片好在哪

    淺談Go數(shù)組比切片好在哪

    Go1.17 會正式支持切片轉(zhuǎn)換到數(shù)據(jù),不再需要用以前那種騷辦法了,本文就談?wù)凣o數(shù)組比切片好在哪,感興趣的可以了解一下
    2021-09-09
  • Golang的os標(biāo)準(zhǔn)庫中常用函數(shù)的整理介紹

    Golang的os標(biāo)準(zhǔn)庫中常用函數(shù)的整理介紹

    這篇文章主要介紹了Go語言的os標(biāo)準(zhǔn)庫中常用函數(shù),主要用來實(shí)現(xiàn)與操作系統(tǒng)的交互功能,需要的朋友可以參考下
    2015-10-10
  • GO語言中的Map使用方法詳解

    GO語言中的Map使用方法詳解

    這篇文章主要給大家介紹了關(guān)于GO語言中Map使用方法的相關(guān)資料,在go語言中map是散列表的引用,map的類型是map[k]v,也就是常說的k-v鍵值對,需要的朋友可以參考下
    2023-08-08
  • gin正確多次讀取http?request?body內(nèi)容實(shí)現(xiàn)詳解

    gin正確多次讀取http?request?body內(nèi)容實(shí)現(xiàn)詳解

    這篇文章主要為大家介紹了gin正確多次讀取http?request?body內(nèi)容實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 關(guān)于go-zero服務(wù)自動收集問題分析

    關(guān)于go-zero服務(wù)自動收集問題分析

    這篇文章主要介紹了關(guān)于go-zero服務(wù)自動收集問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • GO 切片刪除元素的三種方法

    GO 切片刪除元素的三種方法

    本文主要介紹了GO 切片刪除元素,根據(jù)要刪除元素的位置有三種情況,分別是從開頭位置刪除、從中間位置刪除和從尾部刪除,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • go語言題解LeetCode453最小操作次數(shù)使數(shù)組元素相等

    go語言題解LeetCode453最小操作次數(shù)使數(shù)組元素相等

    這篇文章主要為大家介紹了go語言題解LeetCode453最小操作次數(shù)使數(shù)組元素相等示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評論