Go内置序列化库gob的使用

 更新时间:2023年04月28日 16:18:03   作者:fun binary  
本文主要介绍了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​库中。接着,我们就可以在序列化和反序列化时直接使用编码器和解码器了。

到此这篇关于Go内置序列化库gob的使用的文章就介绍到这了,更多相关Go gob内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • gorm golang 并发连接数据库报错的解决方法

    gorm golang 并发连接数据库报错的解决方法

    今天小编就为大家分享一篇gorm golang 并发连接数据库报错的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • 基于Golang设计一套可控的定时任务系统

    基于Golang设计一套可控的定时任务系统

    这篇文章主要为大家学习介绍了如何基于Golang设计一套可控的定时任务系统,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-07-07
  • Golang文件操作之读取与写入方法全攻略

    Golang文件操作之读取与写入方法全攻略

    本文详细介绍了在Go语言中进行文件操作的方法,包括文件的创建、打开、读取、写入和关闭等,解析了使用os、bufio和io包进行高效文件操作的技巧,并提供了错误处理与性能优化的建议,以帮助开发者有效管理文件资源并提升应用性能,需要的朋友可以参考下
    2024-11-11
  • 使用go语言将单反斜杠改为双反斜杠的方法

    使用go语言将单反斜杠改为双反斜杠的方法

    最近开发的时候遇到这么个问题,就是在window上获取了文件目录的字段,然后将这个绝对路径保存到数据库,但是前端展示的时候路径的双反斜杠变成了单反斜杠,本文给大家介绍了使用go语言将单反斜杠改为双反斜杠的方法,需要的朋友可以参考下
    2024-01-01
  • Golang切片删除指定元素的三种方法对比

    Golang切片删除指定元素的三种方法对比

    Go语言并没有提供用于删除元素的语法或接口,而是通过利用切片本身的特性来删除元素—追加元素,这篇文章主要给大家介绍了关于Golang切片删除指定元素的三种方法,需要的朋友可以参考下
    2022-06-06
  • GO实现基于命令行的简单IPS程序代码

    GO实现基于命令行的简单IPS程序代码

    本文介绍了入侵防御系统IPS的工作原理和实现,IPS通过网络流量监控和实时响应,防止网络攻击,通过使用Go语言实现一个简单的IPS示例程序,展示了如何获取本地IP地址和探测网络中其他设备的IP地址,包括如何定义和加载规则文件,以及如何检测IP对相应端口的访问是否达到规定阈值
    2024-12-12
  • Go语言实现常见限流算法的示例代码

    Go语言实现常见限流算法的示例代码

    计数器、滑动窗口、漏斗算法、令牌桶算法是我们常见的几个限流算法,本文将依次用Go语言实现这几个限流算法,感兴趣的可以了解一下
    2023-05-05
  • Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据的思路详解

    Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据的思路详解

    Stream 的实现思想就是将数据处理流程抽象成了一个数据流,每次加工后返回一个新的流供使用。这篇文章主要介绍了Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据,需要的朋友可以参考下
    2022-01-01
  • Go语言tunny的workerWrapper使用教程示例

    Go语言tunny的workerWrapper使用教程示例

    这篇文章主要为大家介绍了Go语言tunny的workerWrapper使用教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Go语言中的通道chan使用指南

    Go语言中的通道chan使用指南

    Go语言的通道chan是实现并发编程的关键工具,主要用于goroutine之间的数据传输,本文主要介绍了通道的基本操作如创建、发送、接收和关闭数据,以及使用select语句进行多路复用和超时控制,感兴趣的可以了解一下
    2024-10-10

最新评论