![](https://raw.githubusercontent.com/code81192/art-demo/master/art-img/sunset-gd662f1f15_1920.jpg)
写在前面
在上一篇文章《Golang中的读写数据(下)》当中,我们学会了Golang当中对于JSON数据的解析,接下来,我们将学习Gob编码方式。
什么是Gob
Gob的定义: Gob是Go自己的以二进制形式序列化和反序列化程序数据的格式,这种数据格式简称之为Gob (Go binary)。
它类似于Java语言当中的Serialization
。你可以在encoding
包中找到它。
Gob可以做什么
Gob 通常用于远程方法调用(RPC)参数和结果的传输,以及应用程序和机器之间的数据传输。
那么,它与我们之前普遍用到的JSON有什么不同呢?
Gob因为是 Go自己的以二进制形式序列化和反序列化程序数据的格式,因此呢只能用于纯Go环境当中,并不适用于异构的环境。例如,它可以用于两个Go程序之间的通信。
Gob的特点
Gob 文件或流是完全自描述的:里面包含的所有类型都有一个对应的描述,并且总是可以用 Go 解码,而不需要了解文件的内容。
只有可导出的字段会被编码,零值会被忽略。
在解码结构体的时候,只有同时匹配名称和可兼容类型的字段才会被解码。
当源数据类型增加新字段后,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当中的错误处理相关的内容。