gob
概述
Gob 是Go语言自己以二进制形式序列化和反序列化程序数据的格式,可以在 encoding 包中找到。这种格式的数据简称为 Gob(即 Go binary 的缩写)。类似于 Python 的“pickle”和 Java 的“Serialization”。
Gob 和 JSON 的 pack 之类的方法一样,由发送端使用 Encoder 对数据结构进行编码。在接收端收到消息之后,接收端使用 Decoder 将序列化的数据变化成本地变量。
Gob典型应用就是在标准库的net/rpc中。
gob
库是Go语言标准库中的一部分,它用于将Go语言的数据类型序列化为字节流,或将字节流反序列化为Go语言的数据类型。gob
库支持的数据类型包括基本数据类型、结构体、数组、切片、映射、通道等。
gob
库的使用非常简单,只需要调用Encode()
函数将数据类型序列化为字节流,或调用Decode()
函数将字节流反序列化为数据类型即可。除此之外,gob
库还支持注册数据类型和自定义编解码器。
gob库的使用示例
下面通过几个示例来演示gob
库的使用方法。
1. 序列化和反序列化基本数据类型
package main
import (
"bytes"
"encoding/gob"
"fmt"
)
func main() {
var buf bytes.Buffer
// 序列化
encoder := gob.NewEncoder(&buf)
err := encoder.Encode(123)
if err != nil {
panic(err)
}
// 反序列化
decoder := gob.NewDecoder(&buf)
var i int
err = decoder.Decode(&i)
if err != nil {
panic(err)
}
fmt.Println(i)
}
在上面的示例中,我们先创建了一个bytes.Buffer
类型的变量buf
,然后使用gob
库的NewEncoder()
函数创建一个编码器encoder
,并将编码器的输出流设置为buf
。接着,我们将整数123
序列化为字节流,并将序列化结果保存在buf
中。最后,我们使用gob
库的NewDecoder()
函数创建一个解码器decoder
,并将解码器的输入流设置为buf
。然后,我们使用decoder
将序列化后的数据反序列化为整数,并将结果保存在变量i
中。最后,我们打印出变量i
的值,输出为123
。
2. 序列化和反序列化结构体
package main
import (
"bytes"
"encoding/gob"
"fmt"
)
type Person struct {
Name string
Age int
}
func main() {
var buf bytes.Buffer
// 序列化
encoder := gob.NewEncoder(&buf)
p := Person{Name: "Alice", Age: 20}
err := encoder.Encode(p)
if err != nil {
panic(err)
}
// 反序列化
decoder := gob.NewDecoder(&buf)
var p2 Person
err = decoder.Decode(&p2)
if err != nil {
panic(err)
}
fmt.Println(p2)
}
在上面的示例中,我们定义了一个结构体Person
,它有两个字段Name
和Age
。我们先创建了一个bytes.Buffer
类型的变量buf
,然后使用gob
库的NewEncoder()
函数创建一个编码器encoder
,并将编码器的输出流设置为buf
。接着,我们创建了一个Person
类型的变量p
,并将它序列化为字节流,并将序列化结果保存在buf
中。最后,我们使用gob
库的NewDecoder()
函数创建一个解码器decoder
,并将解码器的输入流设置为buf
。然后,我们使用decoder
将序列化后的数据反序列化为Person
类型,并将结果保存在变量p2
中。最后,我们打印出变量p2
的值,输出为{Alice 20}
。
3. 注册数据类型
在上面的示例中,我们将Person
结构体序列化和反序列化时,需要使用NewEncoder()
和NewDecoder()
函数创建编码器和解码器。如果我们需要对同一种类型进行多次序列化和反序列化,这样的做法就会非常麻烦。为了解决这个问题,gob
库提供了Register()
函数,可以将一个数据类型注册到gob
库中,这样在序列化和反序列化时就可以直接使用编码器和解码器了。
下面是一个示例:
package main
import (
"bytes"
"encoding/gob"
"fmt"
)
type Person struct {
Name string
Age int
}
func main() {
var buf bytes.Buffer
// 注册数据类型
gob.Register(Person{})
// 序列化
encoder := gob.NewEncoder(&buf)
p := Person{Name: "Alice", Age: 20}
err := encoder.Encode(p)
if err != nil {
panic(err)
}
// 反序列化
decoder := gob.NewDecoder(&buf)
var p2 Person
err = decoder.Decode(&p2)
if err != nil {
panic(err)
}
fmt.Println(p2)
}
在上面的示例中,我们使用gob
库的Register()
函数将Person
结构体注册到gob
库中。接着,我们就可以在序列化和反序列化时直接使用编码器和解码器了。
推荐一个零声学院免费教程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习