0%

golang中的读写数据之Gob

写在前面

在上一篇文章《Golang中的读写数据(下)》当中,我们学会了Golang当中对于JSON数据的解析,接下来,我们将学习Gob编码方式。

什么是Gob

Gob的定义: Gob是Go自己的以二进制形式序列化和反序列化程序数据的格式,这种数据格式简称之为Gob (Go binary)。

它类似于Java语言当中的Serialization 。你可以在encoding 包中找到它。

Gob可以做什么

Gob 通常用于远程方法调用(RPC)参数和结果的传输,以及应用程序和机器之间的数据传输。

那么,它与我们之前普遍用到的JSON有什么不同呢?

Gob因为是 Go自己的以二进制形式序列化和反序列化程序数据的格式,因此呢只能用于纯Go环境当中,并不适用于异构的环境。例如,它可以用于两个Go程序之间的通信。

Gob的特点

  1. Gob 文件或流是完全自描述的:里面包含的所有类型都有一个对应的描述,并且总是可以用 Go 解码,而不需要了解文件的内容。

  2. 只有可导出的字段会被编码,零值会被忽略。

  3. 在解码结构体的时候,只有同时匹配名称和可兼容类型的字段才会被解码。

  4. 当源数据类型增加新字段后,Gob 解码客户端仍然可以以这种方式正常工作:解码客户端会继续识别以前存在的字段。

使用Gob传输数据

和 JSON 的使用方式一样,Gob 使用通用的 io.Writer 接口,通过 NewEncoder() 函数创建 Encoder 对象并调用 Encode();相反的过程使用通用的 io.Reader 接口,通过 NewDecoder() 函数创建 Decoder 对象并调用 Decode()

请看下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package main

import (
"bytes"
"encoding/gob"
"fmt"
)

// 修仙者
type Immortal struct {
Name string
Age int
Gender string
}

type SimpleImmortal struct {
Name string
Age int
}

var buf bytes.Buffer

func main() {

var hanli = Immortal{
Name: "韩立",
Age: 18,
Gender: "男性",
}

fmt.Println("发送数据: ",hanli)
sendMsg(&hanli)
fmt.Println("buf中的数据:",buf)
var i SimpleImmortal
msg, _ := receiveMsg(i)

fmt.Println("接收到数据:",msg)
}

func sendMsg(immortal *Immortal) error {
enc :=gob.NewEncoder(&buf)
return enc.Encode(immortal)
}

func receiveMsg(immortal SimpleImmortal) (SimpleImmortal,error) {
dec := gob.NewDecoder(&buf)

return immortal,dec.Decode(&immortal)

}

输出:

1
2
3
发送数据:  {韩立 18 男性}
buf中的数据: {[50 255 129 3 1 1 8 73 109 109 111 114 116 97 108 1 255 130 0 1 3 1 4 78 97 109 101 1 12 0 1 3 65 103 101 1 4 0 1 6 71 101 110 100 101 114 1 12 0 0 0 21 255 130 1 6 233 159 169 231 171 139 1 36 1 6 231 148 183 230 128 167 0] 0 0}
接收到数据: {韩立 18}

写在最后

关于Gob的内容我们就简单介绍到这里。本文当中涉及到的例子可以点击此处下载。如果我的学习笔记能够给你带来帮助,还请多多点赞鼓励。文章如有错漏之处还请各位小伙伴帮忙斧正。

在下一篇文章当中,我们将一起来学习Golang当中的错误处理相关的内容。

欢迎关注我的其它发布渠道