首頁  >  文章  >  後端開發  >  golang Gob是什麼

golang Gob是什麼

青灯夜游
青灯夜游原創
2023-02-02 17:42:384166瀏覽

gob是Golang套件自帶的資料結構序列化的編碼/解碼工具,編碼使用Encoder,解碼使用Decoder。 Gob使用io.Writer 接口,透過NewEncoder()函數建立Encoder物件透過呼叫Encode()方法實作編碼操作;使用io.Reader接口,透過NewDecoder()函數建立Decoder物件並呼叫Decode()方法完成解碼操作。

golang Gob是什麼

本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

  gob全稱為:Go binary

  Golang自帶的一個資料結構序列化編碼/解碼工具,也就是說gob可以講go中的一個資料結構序列化成某種東西,還能反序列化!序列化成啥我們後面來看,不管是變成一個字串,變成二進位流,變成啥先不管,反正作用就是序列化。

  Gob使用時我們需要關注Encoder和Decoder對象,顧名思義,一個是編碼的時候用的,一個是解碼的時候用的,我們看一下怎麼獲取這兩個對像先:

golang Gob是什麼

golang Gob是什麼

   所以很明確,需要呼叫這兩個函數來取得Encoder和Decoder物件。注意這裡的參數是io.Writer和io.Reader接口類型,我們在上一講介紹過這兩個接口,所以這裡需要的參數分別是實現了io.Writer和io.Reader接口類型的對象即可。

  Encoder和Decoder分別有一個主要的方法是:

golang Gob是什麼

golang Gob是什麼

  看到這裡我們已經可以得到如下結論:

  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/

【相關推薦:Go影片教學程式設計教學

#

以上是golang Gob是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn