golang?用msgpack高效序列化的案例
msgpack
MessagePack是一種高效的二進(jìn)制序列化格式。它允許你在多種語(yǔ)言(如JSON)之間交換數(shù)據(jù)。但它更快更小。
golang 用msgpack高效序列化
package main import ( "fmt" "github.com/go-redis/redis" "reflect" "github.com/vmihailenco/msgpack" ) // 聲明一個(gè)全局的rdb變量 var rdb *redis.Client // 初始化連接 func initClient() (err error) { rdb = redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password set DB: 0, // use default DB }) _, err = rdb.Ping().Result() if err != nil { return err } return nil } type Test struct { name string } func main() { var countryCapitalMap map[string]string /*創(chuàng)建集合 */ countryCapitalMap = make(map[string]string) /* map插入key - value對(duì),各個(gè)國(guó)家對(duì)應(yīng)的首都 */ countryCapitalMap["France"] = "巴黎" countryCapitalMap["Italy"] = "羅馬" countryCapitalMap["Japan"] = "東京" countryCapitalMap["India "] = "新德里" fmt.Println("原數(shù)據(jù)-", countryCapitalMap) //in := map[string]interface{}{"foo": uint32(123456789), "hello": "world"} in := countryCapitalMap res, err := msgpack.Marshal(in) if err != nil { fmt.Printf("序列化失敗") } //fmt.Sprintf("數(shù)據(jù)類型%T", b) fmt.Println(reflect.TypeOf(res)) fmt.Println("序列化數(shù)據(jù)--", res) //連接redis initClient() //存入redis數(shù)據(jù)類型[]type可以存入 bool := rdb.Set("val", res, 0).Err() if bool != nil { fmt.Printf("set val failed, err:%v\n", err) return } //返回類型可變 val, err := rdb.Get("val").Bytes() if err != nil { fmt.Printf("get val failed, err:%v\n", err) return } fmt.Println("redis取出數(shù)據(jù)--", val) var out map[string]string bool = msgpack.Unmarshal(val, &out) if bool != nil { fmt.Println("反序列化失敗") } fmt.Println("反序列化數(shù)據(jù)--", out) }
安裝
go get -u github.com/vmihailenco/msgpack
示例
package main import ( ? ? "fmt" ? ? "github.com/vmihailenco/msgpack" ) // msgpack demo type Person struct { ? ? Name ? string ? ? Age ? ?int ? ? Gender string } func main() { ? ? p1 := Person{ ? ? ? ? Name: ? "沙河娜扎", ? ? ? ? Age: ? ?18, ? ? ? ? Gender: "男", ? ? } ? ? // marshal ? ? b, err := msgpack.Marshal(p1) // 將結(jié)構(gòu)體轉(zhuǎn)化為二進(jìn)制流 ? ? if err != nil { ? ? ? ? fmt.Printf("msgpack marshal failed,err:%v", err) ? ? ? ? return ? ? } ? ? // unmarshal ? ? var p2 Person ? ? err = msgpack.Unmarshal(b, &p2) // 將二進(jìn)制流轉(zhuǎn)化回結(jié)構(gòu)體 ? ? if err != nil { ? ? ? ? fmt.Printf("msgpack unmarshal failed,err:%v", err) ? ? ? ? return ? ? } ? ? fmt.Printf("p2:%#v\n", p2) // p2:main.Person{Name:"沙河娜扎", Age:18, Gender:"男"} }
到此這篇關(guān)于golang 用msgpack高效序列化的案例的文章就介紹到這了,更多相關(guān)golang msgpack序列化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang 獲取文件md5校驗(yàn)的方法以及效率對(duì)比
這篇文章主要介紹了Golang 獲取文件md5校驗(yàn)的方法以及效率對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05go語(yǔ)言Pflag Viper Cobra 核心功能使用介紹
這篇文章主要為大家介紹了go語(yǔ)言Pflag Viper Cobra 核心功能使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Go語(yǔ)言如何實(shí)現(xiàn)Benchmark函數(shù)
go想要在main函數(shù)中測(cè)試benchmark會(huì)麻煩一些,所以這篇文章主要為大家介紹了如何實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的且沒(méi)有開(kāi)銷的benchmark函數(shù),希望對(duì)大家有所幫助2024-12-12go local history本地歷史恢復(fù)代碼神器
這篇文章主要為大家介紹了go local history本地歷史恢復(fù)代碼神器的使用功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Go緩沖channel和非緩沖channel的區(qū)別說(shuō)明
這篇文章主要介紹了Go緩沖channel和非緩沖channel的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04go語(yǔ)言通過(guò)管道連接兩個(gè)命令行進(jìn)程的方法
這篇文章主要介紹了go語(yǔ)言通過(guò)管道連接兩個(gè)命令行進(jìn)程的方法,實(shí)例分析了Go語(yǔ)言操作命令行進(jìn)程的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03Golang中函數(shù)(Function)和方法(Method)的區(qū)別詳解
在Golang中,大家必然會(huì)頻繁使用到函數(shù)(Function)和方法(Method),但是有的同學(xué)可能并沒(méi)有注意過(guò)函數(shù)和方法的異同點(diǎn),函數(shù)和方法都是用來(lái)執(zhí)行特定任務(wù)的代碼塊,雖然很相似,但也有很大的區(qū)別,所以本文將詳細(xì)講解函數(shù)和方法的定義以及它們的異同點(diǎn)2023-07-07Golang使用Gin框架實(shí)現(xiàn)HTTP響應(yīng)格式統(tǒng)一處理
在gin框架中,我們可以定義一個(gè)中間件來(lái)處理統(tǒng)一的HTTP響應(yīng)格式,本文主要為大家介紹了具體是怎么定義實(shí)現(xiàn)這樣的中間件的,感興趣的小伙伴可以了解一下2023-07-07