Go內(nèi)置序列化庫gob的使用
概述
Gob 是Go語言自己以二進(jìn)制形式序列化和反序列化程序數(shù)據(jù)的格式,可以在 encoding 包中找到。這種格式的數(shù)據(jù)簡(jiǎn)稱為 Gob(即 Go binary 的縮寫)。類似于 Python 的“pickle”和 Java 的“Serialization”。
Gob 和 JSON 的 pack 之類的方法一樣,由發(fā)送端使用 Encoder ?對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行編碼。在接收端收到消息之后,接收端使用 Decoder 將序列化的數(shù)據(jù)變化成本地變量。
Gob典型應(yīng)用就是在標(biāo)準(zhǔn)庫的net/rpc中。
?gob?庫是Go語言標(biāo)準(zhǔn)庫中的一部分,它用于將Go語言的數(shù)據(jù)類型序列化為字節(jié)流,或?qū)⒆止?jié)流反序列化為Go語言的數(shù)據(jù)類型。gob?庫支持的數(shù)據(jù)類型包括基本數(shù)據(jù)類型、結(jié)構(gòu)體、數(shù)組、切片、映射、通道等。
?gob?庫的使用非常簡(jiǎn)單,只需要調(diào)用Encode()?函數(shù)將數(shù)據(jù)類型序列化為字節(jié)流,或調(diào)用Decode()?函數(shù)將字節(jié)流反序列化為數(shù)據(jù)類型即可。除此之外,gob?庫還支持注冊(cè)數(shù)據(jù)類型和自定義編解碼器。
gob庫的使用示例
下面通過幾個(gè)示例來演示gob?庫的使用方法。
1. 序列化和反序列化基本數(shù)據(jù)類型
package main
import (
?? ?"bytes"
?? ?"encoding/gob"
?? ?"fmt"
)
func main() {
?? ?var buf bytes.Buffer
?? ?// 序列化
?? ?encoder := gob.NewEncoder(&buf)
?? ?err := encoder.Encode(123)
?? ?if err != nil {
?? ??? ?panic(err)
?? ?}
?? ?// 反序列化
?? ?decoder := gob.NewDecoder(&buf)
?? ?var i int
?? ?err = decoder.Decode(&i)
?? ?if err != nil {
?? ??? ?panic(err)
?? ?}
?? ?fmt.Println(i)
}在上面的示例中,我們先創(chuàng)建了一個(gè)bytes.Buffer?類型的變量buf?,然后使用gob?庫的NewEncoder()?函數(shù)創(chuàng)建一個(gè)編碼器encoder?,并將編碼器的輸出流設(shè)置為buf?。接著,我們將整數(shù)123?序列化為字節(jié)流,并將序列化結(jié)果保存在buf?中。最后,我們使用gob?庫的NewDecoder()?函數(shù)創(chuàng)建一個(gè)解碼器decoder?,并將解碼器的輸入流設(shè)置為buf?。然后,我們使用decoder?將序列化后的數(shù)據(jù)反序列化為整數(shù),并將結(jié)果保存在變量i?中。最后,我們打印出變量i?的值,輸出為123?。
2. 序列化和反序列化結(jié)構(gòu)體
package main
import (
?? ?"bytes"
?? ?"encoding/gob"
?? ?"fmt"
)
type Person struct {
?? ?Name string
?? ?Age ?int
}
func main() {
?? ?var buf bytes.Buffer
?? ?// 序列化
?? ?encoder := gob.NewEncoder(&buf)
?? ?p := Person{Name: "Alice", Age: 20}
?? ?err := encoder.Encode(p)
?? ?if err != nil {
?? ??? ?panic(err)
?? ?}
?? ?// 反序列化
?? ?decoder := gob.NewDecoder(&buf)
?? ?var p2 Person
?? ?err = decoder.Decode(&p2)
?? ?if err != nil {
?? ??? ?panic(err)
?? ?}
?? ?fmt.Println(p2)
}在上面的示例中,我們定義了一個(gè)結(jié)構(gòu)體Person?,它有兩個(gè)字段Name?和Age?。我們先創(chuàng)建了一個(gè)bytes.Buffer?類型的變量buf?,然后使用gob?庫的NewEncoder()?函數(shù)創(chuàng)建一個(gè)編碼器encoder?,并將編碼器的輸出流設(shè)置為buf?。接著,我們創(chuàng)建了一個(gè)Person?類型的變量p?,并將它序列化為字節(jié)流,并將序列化結(jié)果保存在buf?中。最后,我們使用gob?庫的NewDecoder()?函數(shù)創(chuàng)建一個(gè)解碼器decoder?,并將解碼器的輸入流設(shè)置為buf?。然后,我們使用decoder?將序列化后的數(shù)據(jù)反序列化為Person?類型,并將結(jié)果保存在變量p2?中。最后,我們打印出變量p2?的值,輸出為{Alice 20}?。
3. 注冊(cè)數(shù)據(jù)類型
在上面的示例中,我們將Person?結(jié)構(gòu)體序列化和反序列化時(shí),需要使用NewEncoder()?和NewDecoder()?函數(shù)創(chuàng)建編碼器和解碼器。如果我們需要對(duì)同一種類型進(jìn)行多次序列化和反序列化,這樣的做法就會(huì)非常麻煩。為了解決這個(gè)問題,gob?庫提供了Register()?函數(shù),可以將一個(gè)數(shù)據(jù)類型注冊(cè)到gob?庫中,這樣在序列化和反序列化時(shí)就可以直接使用編碼器和解碼器了。
下面是一個(gè)示例:
package main
import (
?? ?"bytes"
?? ?"encoding/gob"
?? ?"fmt"
)
type Person struct {
?? ?Name string
?? ?Age ?int
}
func main() {
?? ?var buf bytes.Buffer
?? ?// 注冊(cè)數(shù)據(jù)類型
?? ?gob.Register(Person{})
?? ?// 序列化
?? ?encoder := gob.NewEncoder(&buf)
?? ?p := Person{Name: "Alice", Age: 20}
?? ?err := encoder.Encode(p)
?? ?if err != nil {
?? ??? ?panic(err)
?? ?}
?? ?// 反序列化
?? ?decoder := gob.NewDecoder(&buf)
?? ?var p2 Person
?? ?err = decoder.Decode(&p2)
?? ?if err != nil {
?? ??? ?panic(err)
?? ?}
?? ?fmt.Println(p2)
}在上面的示例中,我們使用gob?庫的Register()?函數(shù)將Person?結(jié)構(gòu)體注冊(cè)到gob?庫中。接著,我們就可以在序列化和反序列化時(shí)直接使用編碼器和解碼器了。
到此這篇關(guān)于Go內(nèi)置序列化庫gob的使用的文章就介紹到這了,更多相關(guān)Go gob內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
gorm golang 并發(fā)連接數(shù)據(jù)庫報(bào)錯(cuò)的解決方法
今天小編就為大家分享一篇gorm golang 并發(fā)連接數(shù)據(jù)庫報(bào)錯(cuò)的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07
基于Golang設(shè)計(jì)一套可控的定時(shí)任務(wù)系統(tǒng)
這篇文章主要為大家學(xué)習(xí)介紹了如何基于Golang設(shè)計(jì)一套可控的定時(shí)任務(wù)系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-07-07
GO實(shí)現(xiàn)基于命令行的簡(jiǎn)單IPS程序代碼
本文介紹了入侵防御系統(tǒng)IPS的工作原理和實(shí)現(xiàn),IPS通過網(wǎng)絡(luò)流量監(jiān)控和實(shí)時(shí)響應(yīng),防止網(wǎng)絡(luò)攻擊,通過使用Go語言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的IPS示例程序,展示了如何獲取本地IP地址和探測(cè)網(wǎng)絡(luò)中其他設(shè)備的IP地址,包括如何定義和加載規(guī)則文件,以及如何檢測(cè)IP對(duì)相應(yīng)端口的訪問是否達(dá)到規(guī)定閾值2024-12-12
Go?通過?Map/Filter/ForEach?等流式?API?高效處理數(shù)據(jù)的思路詳解
Stream?的實(shí)現(xiàn)思想就是將數(shù)據(jù)處理流程抽象成了一個(gè)數(shù)據(jù)流,每次加工后返回一個(gè)新的流供使用。這篇文章主要介紹了Go?通過?Map/Filter/ForEach?等流式?API?高效處理數(shù)據(jù),需要的朋友可以參考下2022-01-01

