您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“golang Gob怎么使用”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
gob是Golang包自帶的一個數(shù)據(jù)結(jié)構(gòu)序列化的編碼/解碼工具,編碼使用Encoder,解碼使用Decoder。Gob使用io.Writer 接口,通過NewEncoder()函數(shù)創(chuàng)建Encoder對象通過調(diào)用Encode()方法實(shí)現(xiàn)編碼操作;使用io.Reader接口,通過NewDecoder()函數(shù)創(chuàng)建Decoder對象并調(diào)用Decode()方法完成解碼操作。
gob全稱為:Go binary
Golang自帶的一個數(shù)據(jù)結(jié)構(gòu)序列化編碼/解碼工具,也就是說gob可以講go中的一個數(shù)據(jù)結(jié)構(gòu)序列化成某種東西,還能反序列化!序列化成啥我們后面來看,不管是變成一個字符串,變成二進(jìn)制流,變成啥先不管,反正作用就是序列化。
Gob使用時我們需要關(guān)注Encoder和Decoder對象,顧名思義,一個是編碼的時候用的,一個是解碼的時候用的,我們看一下怎么獲取這兩個對象先:
所以很明確,需要調(diào)用這兩個函數(shù)來獲取Encoder和Decoder對象。注意這里的參數(shù)是io.Writer和io.Reader接口類型,我們在上一講介紹過這兩個接口,所以這里需要的參數(shù)分別是實(shí)現(xiàn)了io.Writer和io.Reader接口類型的對象即可。
Encoder和Decoder分別有一個主要的方法是:
看到這里我們已經(jīng)可以得到如下結(jié)論:
Gob 使用 io.Writer 接口,通過 NewEncoder() 函數(shù)創(chuàng)建 Encoder 對象通過調(diào)用 Encode()方法實(shí)現(xiàn)編碼操作;使用 io.Reader 接口,通過 NewDecoder() 函數(shù)創(chuàng)建 Decoder 對象并調(diào)用 Decode()方法完成解碼操作!
接下來我們試著用一下這個Encoder和Decoder,就輕輕松松入門gob了,來看第一個例子
例1:數(shù)據(jù)結(jié)構(gòu)與bytes.Buffer之間的轉(zhuǎn)換(編碼成字節(jié)切片)
1package main
2
3import (
4 "bytes"
5 "fmt"
6 "encoding/gob"
7 "io"
8)
9
10//準(zhǔn)備編碼的數(shù)據(jù)
11type P struct {
12 X, Y, Z int
13 Name string
14}
15
16//接收解碼結(jié)果的結(jié)構(gòu)
17type Q struct {
18 X, Y *int32
19 Name string
20}
21
22func main() {
23 //初始化一個數(shù)據(jù)
24 data := P{3, 4, 5, "CloudGeek"}
25 //編碼后得到buf字節(jié)切片
26 buf := encode(data)
27 //用于接收解碼數(shù)據(jù)
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類型實(shí)現(xiàn)了io.Writer接口
38 var buf bytes.Buffer
39 //得到編碼器
40 enc := gob.NewEncoder(&buf)
41 //調(diào)用編碼器的Encode方法來編碼數(shù)據(jù)data
42 enc.Encode(data)
43 //編碼后的結(jié)果放在buf中
44 return &buf
45}
46
47func decode(data interface{}) *Q {
48 d := data.(io.Reader)
49 //獲取一個解碼器,參數(shù)需要實(shí)現(xiàn)io.Reader接口
50 dec := gob.NewDecoder(d)
51 var q Q
52 //調(diào)用解碼器的Decode方法將數(shù)據(jù)解碼,用Q類型的q來接收
53 dec.Decode(&q)
54 return &q
55}
例2:數(shù)據(jù)結(jié)構(gòu)到文件的序列化和反序列化
1package main
2
3import (
4 "encoding/gob"
5 "os"
6 "fmt"
7)
8
9//試驗(yàn)用的數(shù)據(jù)類型
10type Address struct {
11 City string
12 Country string
13}
14
15//序列化后數(shù)據(jù)存放的路徑
16var filePath string
17
18func main() {
19 filePath = "./address.gob"
20 encode()
21 pa := decode()
22 fmt.Println(*pa) //{Chengdu China}
23}
24
25//將數(shù)據(jù)序列號后寫到文件中
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//從文件中讀取數(shù)據(jù)并反序列化
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個例子應(yīng)該就能體會gob的encode和decode精髓了。
“golang Gob怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。