golang中gob的实现示例

 更新时间:2025年11月14日 11:24:45   作者:盼盼编程  
本文介绍了Go语言的Gob格式,它是Go以二进制形式序列化和反序列化程序数据的格式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Gob 是 Go 自己的以二进制形式序列化和反序列化程序数据的格式;可以在 encoding 包中找到。这种格式的数据简称为 Gob (即 Go binary 的缩写)。类似于 Python 的 "pickle" 和 Java 的 "Serialization"。

Gob 通常用于远程方法调用(RPCs,参见 15.9 的 rpc 包)参数和结果的传输,以及应用程序和机器之间的数据传输。
它和 JSON 或 XML 有什么不同呢?Gob 特定地用于纯 Go 的环境中,例如,两个用 Go 写的服务之间的通信。这样的话服务可以被实现得更加高效和优化。
Gob 不是可外部定义,语言无关的编码方式。因此它的首选格式是二进制,而不是像 JSON 和 XML 那样的文本格式。
Gob 并不是一种不同于 Go 的语言,而是在编码和解码过程中用到了 Go 的反射。

Gob 文件或流是完全自描述的:里面包含的所有类型都有一个对应的描述,并且总是可以用 Go 解码,而不需要了解文件的内容。

只有可导出的字段会被编码,零值会被忽略。在解码结构体的时候,只有同时匹配名称和可兼容类型的字段才会被解码。当源数据类型增加新字段后,Gob 解码客户端仍然可以以这种方式正常工作:解码客户端会继续识别以前存在的字段。并且还提供了很大的灵活性,比如在发送者看来,整数被编码成没有固定长度的可变长度,而忽略具体的 Go 类型。

假如在发送者这边有一个有结构 T:

type T struct { X, Y, Z int }
var t = T{X: 7, Y: 0, Z: 8}

而在接收者这边可以用一个结构体 U 类型的变量 u 来接收这个值:

type U struct { X, Y *int8 }
var u U

在接收者中,X 的值是 7,Y 的值是 0(Y 的值并没有从 t 中传递过来,因为它是零值)

和 JSON 的使用方式一样,Gob 使用通用的 io.Writer 接口,通过 NewEncoder() 函数创建 Encoder 对象并调用 Encode();相反的过程使用通用的 io.Reader 接口,通过 NewDecoder() 函数创建 Decoder 对象并调用 Decode。

我们把示例 12.12 的信息写进名为 vcard.gob 的文件作为例子。这会产生一个文本可读数据和二进制数据的混合,当你试着在文本编辑中打开的时候会看到。

在示例 12.18 中你会看到一个编解码,并且以字节缓冲模拟网络传输的简单例子:

示例 12.18 gob1.go:

// gob1.go
package main
 
import (
    "bytes"
    "fmt"
    "encoding/gob"
    "log"
)
 
type P struct {
    X, Y, Z int
    Name    string
}
 
type Q struct {
    X, Y *int32
    Name string
}
 
func main() {
    // Initialize the encoder and decoder.  Normally enc and dec would be      
    // bound to network connections and the encoder and decoder would      
    // run in different processes.      
    var network bytes.Buffer   // Stand-in for a network connection      
    enc := gob.NewEncoder(&network) // Will write to network.      
    dec := gob.NewDecoder(&network) // Will read from network.      
    // Encode (send) the value.      
    err := enc.Encode(P{3, 4, 5, "Pythagoras"})
    if err != nil {
        log.Fatal("encode error:", err)
    }
    // Decode (receive) the value.      
    var q Q
    err = dec.Decode(&q)
    if err != nil {
        log.Fatal("decode error:", err)
    }
    fmt.Printf("%q: {%d,%d}\n", q.Name, *q.X, *q.Y)
}
// Output:   "Pythagoras": {3,4}

示例 12.19 gob2.go 编码到文件:

import (
    "bufio"
    "encoding/gob"
    "fmt"
    "log"
    "os"
)
 
type Address struct {
    Type    string
    City    string
    Country string
}
 
type VCard struct {
    FirstName string
    LastName  string
    Addresses []*Address
    Remark    string
}
 
var content string
var vc VCard
 
func main() {
    // using a decoder:
    file, _ := os.Open("vcard.gob")
    defer file.Close()
    inReader := bufio.NewReader(file)
    dec := gob.NewDecoder(inReader)
    err := dec.Decode(&vc)
    if err != nil {
        log.Println("Error in decoding gob")
    }
    fmt.Println(vc)
}
 
// Output:
// {Jan Kersschot [0x12642e60 0x12642e80] none}

​

degob.go:

import (
    "bufio"
    "encoding/gob"
    "fmt"
    "log"
    "os"
)
 
type Address struct {
    Type    string
    City    string
    Country string
}
 
type VCard struct {
    FirstName string
    LastName  string
    Addresses []*Address
    Remark    string
}
 
var content string
var vc VCard
 
func main() {
    // using a decoder:
    file, _ := os.Open("vcard.gob")
    defer file.Close()
    inReader := bufio.NewReader(file)
    dec := gob.NewDecoder(inReader)
    err := dec.Decode(&vc)
    if err != nil {
        log.Println("Error in decoding gob")
    }
    fmt.Println(vc)
}
 
// Output:
// {Jan Kersschot [0x12642e60 0x12642e80] none}

到此这篇关于golang中gob的实现示例的文章就介绍到这了,更多相关golang gob内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang基于Vault实现敏感数据加解密

    Golang基于Vault实现敏感数据加解密

    数据加密是主要的数据安全防护技术之一,敏感数据应该加密存储在数据库中,降低泄露风险,本文将介绍一下利用Vault实现敏感数据加解密的方法,需要的可以参考一下
    2023-07-07
  • Golang并发绕不开的重要组件之Goroutine详解

    Golang并发绕不开的重要组件之Goroutine详解

    Goroutine、Channel、Context、Sync都是Golang并发编程中的几个重要组件,这篇文中主要为大家介绍了Goroutine的相关知识,需要的可以参考一下
    2023-06-06
  • 详解如何在Go中如何编写出可测试的代码

    详解如何在Go中如何编写出可测试的代码

    在编写测试代码之前,还有一个很重要的点,容易被忽略,就是什么样的代码是可测试的代码,所以本文就来聊一聊在 Go 中如何写出可测试的代码吧
    2023-08-08
  • go数据结构和算法BitMap原理及实现示例

    go数据结构和算法BitMap原理及实现示例

    这篇文章主要为大家介绍了go数据结构和算法BitMap原理及实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • golang struct json tag的使用以及深入讲解

    golang struct json tag的使用以及深入讲解

    这篇文章主要给大家介绍了关于golang struct json tag的使用以及深入讲解,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • 关于go-zero服务自动收集问题分析

    关于go-zero服务自动收集问题分析

    这篇文章主要介绍了关于go-zero服务自动收集问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • 一文搞懂Go语言堆内存原理小结

    一文搞懂Go语言堆内存原理小结

    堆内存是程序运行时动态分配的内存区域,与栈内存形成对比,本文就来详细的介绍一下Go语言堆内存原理小结, 具有一定的参考价值,感兴趣的可以了解一下
    2025-10-10
  • Go 使用os包操作环境变量的方法

    Go 使用os包操作环境变量的方法

    环境变量通常在程序启动时就已设置好,在需要的时候随时读取,Go使用简单的几个函数就可以对环境变量进行增删查改,本文给大家介绍Go 使用os包操作环境变量的方法,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • 使用gopacket解析协议层中的相关数据方式

    使用gopacket解析协议层中的相关数据方式

    文章介绍使用Wireshark抓取ping数据包并保存为pcap格式,通过Go语言gopacket解析,提取IP版本号、指定标识的数据包长度及应用层ICMP字符串内容,展示TCP/IP协议族解析的简便方法
    2025-07-07
  • Golang通脉之map详情

    Golang通脉之map详情

    这篇文章主要介绍了Golang通脉之map,Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现,map 是一种无序的键值对的集合。map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值 map 是一种集合,所以可以像迭代数组和切片那样迭代它
    2021-10-10

最新评论