Go内置序列化库 - gob

简介: Go内置序列化库 - gob

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​库中。接着,我们就可以在序列化和反序列化时直接使用编码器和解码器了。

相关文章
|
2月前
|
Shell Go API
Go语言grequests库并发请求的实战案例
Go语言grequests库并发请求的实战案例
|
3月前
|
Rust 安全 算法
Go标准库的新 math/rand
Go标准库的新 math/rand
|
17天前
|
存储 Cloud Native Shell
go库介绍:Golang中的Viper库
Viper 是 Golang 中的一个强大配置管理库,支持环境变量、命令行参数、远程配置等多种配置来源。本文详细介绍了 Viper 的核心特点、应用场景及使用方法,并通过示例展示了其强大功能。无论是简单的 CLI 工具还是复杂的分布式系统,Viper 都能提供优雅的配置管理方案。
|
20天前
|
JSON 安全 网络协议
go语言使用内置函数和标准库
【10月更文挑战第18天】
14 3
|
21天前
|
JSON 监控 安全
go语言选择合适的工具和库
【10月更文挑战第17天】
12 2
|
2月前
|
Go
Go to Learn Go之Gob
Go to Learn Go之Gob
23 8
|
1月前
|
Linux 编译器 Go
cgo--在Go中链接外部C库
cgo--在Go中链接外部C库
|
3月前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
135 1
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
3月前
|
存储 JSON 前端开发
一文搞懂 Go 1.21 的日志标准库 - slog
一文搞懂 Go 1.21 的日志标准库 - slog
115 2
|
3月前
|
Prometheus Cloud Native Go
Go 1.22 标准库 slices 新增函数和一些旧函数增加新特性
Go 1.22 标准库 slices 新增函数和一些旧函数增加新特性