12.11 用 Gob 传输数据

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

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

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

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

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

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

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

    示例 12.18 gob1.go

    示例 12.19 编码到文件:

    写一个程序读取 vcard.gob 文件,解码并打印它的内容。