最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang常用包使用介紹

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

sync包

常用的有3個(gè)功能

鎖分為普通互斥鎖和讀寫(xiě)鎖

互斥鎖 Mutex讀寫(xiě)鎖 RWMutex
一個(gè)線(xiàn)程未釋放鎖時(shí),其他線(xiàn)程加鎖阻塞讀鎖:一個(gè)線(xiàn)程未釋放讀鎖時(shí),其他線(xiàn)程可獲取讀鎖,獲取寫(xiě)鎖阻塞
寫(xiě)鎖:一個(gè)線(xiàn)程未釋放寫(xiě)鎖時(shí),其他線(xiàn)程可獲取讀鎖或?qū)戞i都會(huì)阻塞

線(xiàn)程監(jiān)聽(tīng)WaitGroup

使用場(chǎng)景:用于監(jiān)聽(tīng)一組子線(xiàn)程是否執(zhí)行完畢

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

池Pool

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

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

encoding/binary包

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

單數(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é)時(shí),排位位置的不同,如下

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

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

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

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

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

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

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

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

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

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

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

解析切片中的某個(gè)數(shù)字,要知道該數(shù)字在切片中占用的起始位置,若位置不對(duì)則無(wú)法解析出正確的數(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í),只要能夠從正確的位置開(kāi)始解析,就會(huì)解析出正確的數(shù)字

encoding/gob包

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

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

	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)
	}

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

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

type Getter interface {
    Get() string
}
type Foo struct {
    Bar string
}
func (f Foo)Get() string {
    return f.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() 類(lèi)型,但其實(shí)是Foo類(lèi)型,就會(huì)報(bào)錯(cuò)
enc := gob.NewEncoder(buf)
enc.Encode(&g)

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

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

hash/crc32包

常用方法:

func ChecksumIEEE(data []byte) uint32

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

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

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

相關(guān)文章

  • Go實(shí)現(xiàn)自己的網(wǎng)絡(luò)流量解析和行為檢測(cè)引擎原理

    Go實(shí)現(xiàn)自己的網(wǎng)絡(luò)流量解析和行為檢測(cè)引擎原理

    這篇文章主要為大家介紹了Go實(shí)現(xiàn)自己的網(wǎng)絡(luò)流量解析和行為檢測(cè)引擎原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Go模板后端渲染時(shí)vue單頁(yè)面沖突

    Go模板后端渲染時(shí)vue單頁(yè)面沖突

    go后端模版語(yǔ)法是通過(guò) {{}} ,vue也是通過(guò)雙花括號(hào)來(lái)渲染的,如果使用go渲染vue的html頁(yè)面的時(shí)候就會(huì)報(bào)錯(cuò),本文主要介紹了Go模板后端渲染時(shí)vue單頁(yè)面沖突,感興趣的可以了解一下
    2024-01-01
  • 使用GO實(shí)現(xiàn)Paxos共識(shí)算法的方法

    使用GO實(shí)現(xiàn)Paxos共識(shí)算法的方法

    這篇文章主要介紹了使用GO實(shí)現(xiàn)Paxos共識(shí)算法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • go語(yǔ)言中int和byte轉(zhuǎn)換方式

    go語(yǔ)言中int和byte轉(zhuǎn)換方式

    這篇文章主要介紹了go語(yǔ)言中int和byte轉(zhuǎn)換方式,需要的朋友可以參考下
    2018-11-11
  • golang中定時(shí)器cpu使用率高的現(xiàn)象詳析

    golang中定時(shí)器cpu使用率高的現(xiàn)象詳析

    這篇文章主要給大家介紹了關(guān)于golang中定時(shí)器cpu使用率高的現(xiàn)象的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • Golang?流水線(xiàn)設(shè)計(jì)模式實(shí)踐示例詳解

    Golang?流水線(xiàn)設(shè)計(jì)模式實(shí)踐示例詳解

    這篇文章主要為大家介紹了Golang?流水線(xiàn)設(shè)計(jì)模式實(shí)踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Golang中的深拷貝與淺拷貝使用

    Golang中的深拷貝與淺拷貝使用

    本文主要介紹了Golang中的深拷貝與淺拷貝使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Go?語(yǔ)言使用goroutine運(yùn)行閉包踩坑分析

    Go?語(yǔ)言使用goroutine運(yùn)行閉包踩坑分析

    這篇文章主要介紹了Go?語(yǔ)言使用goroutine運(yùn)行閉包踩坑解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Golang程序如何查找內(nèi)存泄漏(pprof)

    Golang程序如何查找內(nèi)存泄漏(pprof)

    該文章詳細(xì)介紹了如何使用Golang的pprof工具查找內(nèi)存泄漏,首先,在main包中引入pprof包并設(shè)置條件編譯,然后編譯程序并運(yùn)行,通過(guò)執(zhí)行g(shù)otoolpprof-inuse_space命令,可以進(jìn)入交互模式并使用top命令查看內(nèi)存分配最多的函數(shù),如果本機(jī)中有源代碼
    2024-12-12
  • 詳解Go程序添加遠(yuǎn)程調(diào)用tcpdump功能

    詳解Go程序添加遠(yuǎn)程調(diào)用tcpdump功能

    這篇文章主要介紹了go程序添加遠(yuǎn)程調(diào)用tcpdump功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05

最新評(píng)論

麻城市| 姜堰市| 仙游县| 新密市| 拜城县| 惠来县| 景德镇市| 阿拉善左旗| 阿鲁科尔沁旗| 玉龙| 略阳县| 库尔勒市| 彭山县| 黑山县| 慈溪市| 湟中县| 平阳县| 华池县| 正定县| 大田县| 建昌县| 彭阳县| 双城市| 禹州市| 千阳县| 长治市| 额尔古纳市| 泰和县| 公安县| 霍城县| 秦安县| 河西区| 称多县| 即墨市| 喀什市| 临朐县| 蒲城县| 永靖县| 顺平县| 武定县| 洛宁县|