gob是Golang套件自帶的資料結構序列化的編碼/解碼工具,編碼使用Encoder,解碼使用Decoder。 Gob使用io.Writer 接口,透過NewEncoder()函數建立Encoder物件透過呼叫Encode()方法實作編碼操作;使用io.Reader接口,透過NewDecoder()函數建立Decoder物件並呼叫Decode()方法完成解碼操作。
本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。
gob全稱為:Go binary
Golang自帶的一個資料結構序列化編碼/解碼工具,也就是說gob可以講go中的一個資料結構序列化成某種東西,還能反序列化!序列化成啥我們後面來看,不管是變成一個字串,變成二進位流,變成啥先不管,反正作用就是序列化。
Gob使用時我們需要關注Encoder和Decoder對象,顧名思義,一個是編碼的時候用的,一個是解碼的時候用的,我們看一下怎麼獲取這兩個對像先:
所以很明確,需要呼叫這兩個函數來取得Encoder和Decoder物件。注意這裡的參數是io.Writer和io.Reader接口類型,我們在上一講介紹過這兩個接口,所以這裡需要的參數分別是實現了io.Writer和io.Reader接口類型的對象即可。
Encoder和Decoder分別有一個主要的方法是:
看到這裡我們已經可以得到如下結論:
Gob 使用io.Writer 接口,透過NewEncoder() 函數建立Encoder 物件透過呼叫Encode()方法實作編碼操作;使用io.Reader 接口,透過NewDecoder() 函數建立Decoder 物件並建立Decoder 物件並建立Decoder 物件並呼叫Decode()方法完成解碼操作!
接下來我們試著用一下這個Encoder和Decoder,就輕輕鬆鬆入門gob了,來看第一個例子
例1:資料結構與bytes.Buffer之間的轉換(編碼成位元組切片)
1package main 2 3import ( 4 "bytes" 5 "fmt" 6 "encoding/gob" 7 "io" 8) 9 10//准备编码的数据 11type P struct { 12 X, Y, Z int 13 Name string 14} 15 16//接收解码结果的结构 17type Q struct { 18 X, Y *int32 19 Name string 20} 21 22func main() { 23 //初始化一个数据 24 data := P{3, 4, 5, "CloudGeek"} 25 //编码后得到buf字节切片 26 buf := encode(data) 27 //用于接收解码数据 28 var q *Q 29 //解码操作 30 q = decode(buf) 31 //"CloudGeek": {3,4} 32 fmt.Printf("%q: {%d,%d}\n", q.Name, *q.X, *q.Y) 33 34} 35 36func encode(data interface{}) *bytes.Buffer { 37 //Buffer类型实现了io.Writer接口 38 var buf bytes.Buffer 39 //得到编码器 40 enc := gob.NewEncoder(&buf) 41 //调用编码器的Encode方法来编码数据data 42 enc.Encode(data) 43 //编码后的结果放在buf中 44 return &buf 45} 46 47func decode(data interface{}) *Q { 48 d := data.(io.Reader) 49 //获取一个解码器,参数需要实现io.Reader接口 50 dec := gob.NewDecoder(d) 51 var q Q 52 //调用解码器的Decode方法将数据解码,用Q类型的q来接收 53 dec.Decode(&q) 54 return &q 55}
例2:資料結構到檔案的序列化和反序列化
1package main 2 3import ( 4 "encoding/gob" 5 "os" 6 "fmt" 7) 8 9//试验用的数据类型 10type Address struct { 11 City string 12 Country string 13} 14 15//序列化后数据存放的路径 16var filePath string 17 18func main() { 19 filePath = "./address.gob" 20 encode() 21 pa := decode() 22 fmt.Println(*pa) //{Chengdu China} 23} 24 25//将数据序列号后写到文件中 26func encode() { 27 pa := &Address{"Chengdu", "China"} 28 //打开文件,不存在的时候新建 29 file, _ := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY, 0666) 30 defer file.Close() 31 32 //encode后写到这个文件中 33 enc := gob.NewEncoder(file) 34 enc.Encode(pa) 35} 36 37//从文件中读取数据并反序列化 38func decode() *Address { 39 file, _ := os.Open(filePath) 40 defer file.Close() 41 42 var pa Address 43 //decode操作 44 dec := gob.NewDecoder(file) 45 dec.Decode(&pa) 46 return &pa 47}
上面2個例子都不難,我去掉了錯誤處理之類的程式碼,盡量註解了每塊程式碼,耐心看完這2個例子應該就能體會gob的encode和decode精髓了。
理解gob是什麼的基礎上,如果你需要使用gob開發,建議詳細看一下官方文檔,了解更多的細節:https://golang.org/pkg/encoding/gob/
#以上是golang Gob是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!