Go语言使用Gob传输数据

作者:C语言中文网 时间:2023-08-06 05:12:28 

为了让某个数据结构能够在网络上传输或能够保存至文件,它必须被编码然后再解码。当然已经有许多可用的编码方式了,比如 JSON、XML、Google 的 protocol buffers 等等。而现在又多了一种,由Go语言 encoding/gob 包提供的方式。

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

Gob 和 JSON 的 pack 之类的方法一样,由发送端使用 Encoder 对数据结构进行编码。在接收端收到消息之后,接收端使用 Decoder 将序列化的数据变化成本地变量。

Go语言可以通过 JSON 或 Gob 来序列化 struct 对象,虽然 JSON 的序列化更为通用,但利用 Gob 编码可以实现 JSON 所不能支持的 struct 的方法序列化,利用 Gob 包序列化 struct 保存到本地也十分简单。

Gob 不是可外部定义、语言无关的编码方式,它的首选的是二进制格式,而不是像 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 。

创建 gob 文件

下面通过简单的示例程序来演示Go语言是如何创建 gob 文件的,代码如下所示:

package main
import (
   "encoding/gob"
   "fmt"
   "os"
)
func main() {
   info := map[string]string{
       "name":    "asp之家",
       "website": "http://aspxhome.com/golang/",
   }
   name := "demo.gob"
   File, _ := os.OpenFile(name, os.O_RDWR|os.O_CREATE, 0777)
   defer File.Close()
   enc := gob.NewEncoder(File)
   if err := enc.Encode(info); err != nil {
       fmt.Println(err)
   }
}

运行上面的代码会在当前目录下生成 demo.gob 文件,文件的内容如下所示:

0eff 8104 0102 ff82 0001 0c01 0c00 0041
ff82 0002 046e 616d 6510 43e8 afad e8a8
80e4 b8ad e696 87e7 bd91 0777 6562 7369
7465 1e68 7474 703a 2f2f 632e 6269 616e
... ...

读取 gob 文件

读取 gob 文件与创建 gob 文件同样简单,示例代码如下:

package main
import (
   "encoding/gob"
   "fmt"
   "os"
)
func main() {
   var M map[string]string
   File, _ := os.Open("demo.gob")
   D := gob.NewDecoder(File)
   D.Decode(&M)
   fmt.Println(M)
}

运行结果如下:

go run main.go
map[name:asp之家 website:http://aspxhome.com/golang/]

来源:http://c.biancheng.net/view/4597.html

标签:Go语言,Gob,传输数据
0
投稿

猜你喜欢

  • 浅谈Python项目的服务器部署

    2021-01-10 04:26:48
  • 对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解

    2023-06-04 19:17:50
  • Ubuntu16.04/树莓派Python3+opencv配置教程(分享)

    2023-03-30 12:38:59
  • Python3 实现爬取网站下所有URL方式

    2022-03-28 07:12:37
  • iframe全跨域高度自适应解决方案

    2008-12-21 16:16:00
  • 实现文字放大效果Javascript源码

    2010-03-17 20:46:00
  • Python实现简单的文本相似度分析操作详解

    2023-07-18 11:16:12
  • python-docx的简单使用示例教程

    2023-10-27 08:32:08
  • 整理Python最基本的操作字典的方法

    2022-03-01 07:04:38
  • Pycharm学习教程(2) 代码风格

    2022-03-21 08:38:31
  • pycharm: 恢复(reset) 误删文件的方法

    2023-09-09 10:11:24
  • python里的条件语句和循环语句你了解多少

    2022-07-19 02:27:49
  • Centos7安装 mysql5.6.29 shell脚本

    2024-01-15 22:17:41
  • selenium WebDriverWait类等待机制的实现

    2022-12-18 13:07:21
  • 举例区分Python中的浅复制与深复制

    2022-08-20 02:34:57
  • Mysql my.ini 配置文件详解

    2024-01-28 06:16:57
  • 使用Python的datetime库处理时间(RPA流程)

    2023-04-23 22:53:15
  • 对fieldset和legend的默认样式一点分析

    2008-07-02 12:56:00
  • Bootstrap-table自定义可编辑每页显示记录数

    2024-04-29 13:12:30
  • 柳永法:vbs或asp采集文章时网页编码问题

    2009-02-04 10:50:00
  • asp之家 网络编程 m.aspxhome.com