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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言中一定要知道的切片使用注意事项总结

    Go语言中一定要知道的切片使用注意事项总结

    了解和掌握切片的使用注意事项,可以避免意外的程序行为,所以本文就来和大家深入探讨一下Go语言切片常见的注意事项,希望对大家有所帮助
    2023-06-06
  • Go读写锁操作方法示例详解

    Go读写锁操作方法示例详解

    这篇文章主要为大家介绍了Go读写锁方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 一文了解golang 占位符

    一文了解golang 占位符

    本文主要介绍了一文了解golang 占位符,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 使用go自定义prometheus的exporter

    使用go自定义prometheus的exporter

    在prometheus中如果要监控服务器和应用的各种指标,需要用各种各样的exporter服务,这篇文章主要介绍了使用go自定义prometheus的exporter,需要的朋友可以参考下
    2023-03-03
  • 基于Go语言实现选择排序算法及优化

    基于Go语言实现选择排序算法及优化

    选择排序是一种简单的比较排序算法.这篇文章将利用Go语言实现冒泡排序算法,文中的示例代码讲解详细,对学习Go语言有一定的帮助,需要的可以参考一下
    2022-12-12
  • Go语言循环遍历含有中文的字符串的方法小结

    Go语言循环遍历含有中文的字符串的方法小结

    这篇文章主要介绍了Go语言循环遍历含有中文的字符串的几种方法,文章通过代码示例讲解的非常详细,具有一定的参考价值,感兴趣的小伙伴跟着小编一起来看看吧
    2023-07-07
  • Go channel实现原理分析

    Go channel实现原理分析

    Channel是go语言内置的一个非常重要的特性,也是go并发编程的两大基石之一,下面这篇文章主要给大家介绍了关于Go中channel的相关资料,需要的朋友可以参考下
    2023-04-04
  • golang 使用chromedp获取页面请求日志network

    golang 使用chromedp获取页面请求日志network

    这篇文章主要为大家介绍了golang 使用chromedp获取页面请求日志network方法实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • go语言使用jwt认证的实现

    go语言使用jwt认证的实现

    本文主要介绍了go语言使用jwt认证的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Golang使用panic控制程序错误流程

    Golang使用panic控制程序错误流程

    这篇文章主要介绍了Golang使用panic控制程序错误流程,Golang panic异常处理机制中的一种流程控制方式,用于中断程序流程并触发异常处理
    2023-04-04

最新评论