golang中g(shù)ob的實現(xiàn)示例
Gob 是 Go 自己的以二進制形式序列化和反序列化程序數(shù)據(jù)的格式;可以在 encoding 包中找到。這種格式的數(shù)據(jù)簡稱為 Gob (即 Go binary 的縮寫)。類似于 Python 的 "pickle" 和 Java 的 "Serialization"。
Gob 通常用于遠程方法調(diào)用(RPCs,參見 15.9 的 rpc 包)參數(shù)和結(jié)果的傳輸,以及應(yīng)用程序和機器之間的數(shù)據(jù)傳輸。
它和 JSON 或 XML 有什么不同呢?Gob 特定地用于純 Go 的環(huán)境中,例如,兩個用 Go 寫的服務(wù)之間的通信。這樣的話服務(wù)可以被實現(xiàn)得更加高效和優(yōu)化。
Gob 不是可外部定義,語言無關(guān)的編碼方式。因此它的首選格式是二進制,而不是像 JSON 和 XML 那樣的文本格式。
Gob 并不是一種不同于 Go 的語言,而是在編碼和解碼過程中用到了 Go 的反射。
Gob 文件或流是完全自描述的:里面包含的所有類型都有一個對應(yīng)的描述,并且總是可以用 Go 解碼,而不需要了解文件的內(nèi)容。
只有可導(dǎo)出的字段會被編碼,零值會被忽略。在解碼結(jié)構(gòu)體的時候,只有同時匹配名稱和可兼容類型的字段才會被解碼。當(dāng)源數(shù)據(jù)類型增加新字段后,Gob 解碼客戶端仍然可以以這種方式正常工作:解碼客戶端會繼續(xù)識別以前存在的字段。并且還提供了很大的靈活性,比如在發(fā)送者看來,整數(shù)被編碼成沒有固定長度的可變長度,而忽略具體的 Go 類型。
假如在發(fā)送者這邊有一個有結(jié)構(gòu) T:
type T struct { X, Y, Z int }
var t = T{X: 7, Y: 0, Z: 8}而在接收者這邊可以用一個結(jié)構(gòu)體 U 類型的變量 u 來接收這個值:
type U struct { X, Y *int8 }
var u U在接收者中,X 的值是 7,Y 的值是 0(Y 的值并沒有從 t 中傳遞過來,因為它是零值)
和 JSON 的使用方式一樣,Gob 使用通用的 io.Writer 接口,通過 NewEncoder() 函數(shù)創(chuàng)建 Encoder 對象并調(diào)用 Encode();相反的過程使用通用的 io.Reader 接口,通過 NewDecoder() 函數(shù)創(chuàng)建 Decoder 對象并調(diào)用 Decode。
我們把示例 12.12 的信息寫進名為 vcard.gob 的文件作為例子。這會產(chǎn)生一個文本可讀數(shù)據(jù)和二進制數(shù)據(jù)的混合,當(dāng)你試著在文本編輯中打開的時候會看到。
在示例 12.18 中你會看到一個編解碼,并且以字節(jié)緩沖模擬網(wǎng)絡(luò)傳輸?shù)暮唵卫樱?/p>
示例 12.18 gob1.go:
// gob1.go
package main
import (
"bytes"
"fmt"
"encoding/gob"
"log"
)
type P struct {
X, Y, Z int
Name string
}
type Q struct {
X, Y *int32
Name string
}
func main() {
// Initialize the encoder and decoder. Normally enc and dec would be
// bound to network connections and the encoder and decoder would
// run in different processes.
var network bytes.Buffer // Stand-in for a network connection
enc := gob.NewEncoder(&network) // Will write to network.
dec := gob.NewDecoder(&network) // Will read from network.
// Encode (send) the value.
err := enc.Encode(P{3, 4, 5, "Pythagoras"})
if err != nil {
log.Fatal("encode error:", err)
}
// Decode (receive) the value.
var q Q
err = dec.Decode(&q)
if err != nil {
log.Fatal("decode error:", err)
}
fmt.Printf("%q: {%d,%d}\n", q.Name, *q.X, *q.Y)
}
// Output: "Pythagoras": {3,4}示例 12.19 gob2.go 編碼到文件:
import (
"bufio"
"encoding/gob"
"fmt"
"log"
"os"
)
type Address struct {
Type string
City string
Country string
}
type VCard struct {
FirstName string
LastName string
Addresses []*Address
Remark string
}
var content string
var vc VCard
func main() {
// using a decoder:
file, _ := os.Open("vcard.gob")
defer file.Close()
inReader := bufio.NewReader(file)
dec := gob.NewDecoder(inReader)
err := dec.Decode(&vc)
if err != nil {
log.Println("Error in decoding gob")
}
fmt.Println(vc)
}
// Output:
// {Jan Kersschot [0x12642e60 0x12642e80] none}
?degob.go:
import (
"bufio"
"encoding/gob"
"fmt"
"log"
"os"
)
type Address struct {
Type string
City string
Country string
}
type VCard struct {
FirstName string
LastName string
Addresses []*Address
Remark string
}
var content string
var vc VCard
func main() {
// using a decoder:
file, _ := os.Open("vcard.gob")
defer file.Close()
inReader := bufio.NewReader(file)
dec := gob.NewDecoder(inReader)
err := dec.Decode(&vc)
if err != nil {
log.Println("Error in decoding gob")
}
fmt.Println(vc)
}
// Output:
// {Jan Kersschot [0x12642e60 0x12642e80] none}到此這篇關(guān)于golang中g(shù)ob的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)golang gob內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang基于Vault實現(xiàn)敏感數(shù)據(jù)加解密
數(shù)據(jù)加密是主要的數(shù)據(jù)安全防護技術(shù)之一,敏感數(shù)據(jù)應(yīng)該加密存儲在數(shù)據(jù)庫中,降低泄露風(fēng)險,本文將介紹一下利用Vault實現(xiàn)敏感數(shù)據(jù)加解密的方法,需要的可以參考一下2023-07-07
Golang并發(fā)繞不開的重要組件之Goroutine詳解
Goroutine、Channel、Context、Sync都是Golang并發(fā)編程中的幾個重要組件,這篇文中主要為大家介紹了Goroutine的相關(guān)知識,需要的可以參考一下2023-06-06
go數(shù)據(jù)結(jié)構(gòu)和算法BitMap原理及實現(xiàn)示例
這篇文章主要為大家介紹了go數(shù)據(jù)結(jié)構(gòu)和算法BitMap原理及實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07
golang?struct?json?tag的使用以及深入講解
這篇文章主要給大家介紹了關(guān)于golang?struct?json?tag的使用以及深入講解,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-02-02
使用gopacket解析協(xié)議層中的相關(guān)數(shù)據(jù)方式
文章介紹使用Wireshark抓取ping數(shù)據(jù)包并保存為pcap格式,通過Go語言gopacket解析,提取IP版本號、指定標(biāo)識的數(shù)據(jù)包長度及應(yīng)用層ICMP字符串內(nèi)容,展示TCP/IP協(xié)議族解析的簡便方法2025-07-07

