Go内置序列化库gob如何使用
本篇内容介绍了“Go内置序列化库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库中。接着,我们就可以在序列化和反序列化时直接使用编码器和解码器了。
相关内容
这些是最新的
热门排行
- THINKPHP5+GatewayWorker+Workerman 开发在线客服系统
- 在手机浏览器网页中点击链接跳转到微信界面的方法
- 尊云网站目录系统 ThinkPHP5网站分类目录程序 v2.2.221011
- CentOS 7安装shadowsock(一键安装脚本)
- AdminTemplate 基于LayUI 2.4.5实现的网站后台管理模板
- 用NW.js(node-webkit)开发多平台的桌面客户端
- PHP生成随机昵称/用户名
- THINKPHP5网站分类目录程序 尊云网站目录系统
- 织梦(DEDECMS)微信支付接口 微信插件
- 基于LayUI开发的 网站后台管理模板 BeginnerAdmin
- 响应式后台网站模板 - AMA.ADMIN
- layuiAdmin后台管理模板 Iframe版
- LayUI 1.0.9 升级 至 LayUI 2.1.4 方法
- 简洁清爽的会员中心模板
- jQuery幸运大转盘抽奖活动代码