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 mainimport ("bytes""fmt""encoding/gob""log"
)type P struct {X, Y, Z intName    string
}type Q struct {X, Y *int32Name 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 Qerr = 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 编码到文件:

// gob2.go
package mainimport ("encoding/gob""log""os"
)type Address struct {Type             stringCity             stringCountry          string
}type VCard struct {FirstName   stringLastName    stringAddresses   []*AddressRemark      string
}var content stringfunc main() {pa := &Address{"private", "Aartselaar","Belgium"}wa := &Address{"work", "Boom", "Belgium"}vc := VCard{"Jan", "Kersschot", []*Address{pa,wa}, "none"}// fmt.Printf("%v: \n", vc) // {Jan Kersschot [0x126d2b80 0x126d2be0] none}:// using an encoder:file, _ := os.OpenFile("vcard.gob", os.O_CREATE|os.O_WRONLY, 0666)defer file.Close()enc := gob.NewEncoder(file)err := enc.Encode(vc)if err != nil {log.Println("Error in encoding gob")}
}

degob.go:

import ("bufio""encoding/gob""fmt""log""os"
)type Address struct {Type    stringCity    stringCountry string
}type VCard struct {FirstName stringLastName  stringAddresses []*AddressRemark    string
}var content string
var vc VCardfunc 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相关推荐

  1. Golang中Buffer高效拼接字符串以及自定义线程安全Buffer

    本文原创文章,转载注明出处,博客地址 https://segmentfault.com/u/to... 第一时间看后续精彩文章.觉得好的话,顺手分享到朋友圈吧,感谢支持. Go中可以使用"+ ...

  2. 如何在golang中关闭bufio.reader_Golang 并发模型系列:1. 轻松入门流水线模型

    Go语言中文网,致力于每日分享编码.开源等知识,欢迎关注我,会有意想不到的收获! Golang作为一个实用主义的编程语言,非常注重性能,在语言特性上天然支持并发,它有多种并发模型,通过流水线模型系列文 ...

  3. go语言的iota是什么意思_关于Golang中的iota

    快速一览 iota是Golang中提供的一个简化常量和枚举编程的标识符,合理的使用这个标识符可以让代码变得更简洁,省去大量的不必要的代码. 比如下面的这个常量定义 const ( a = 1 b = ...

  4. Golang中的panic和recover(捕获异常)

    Golang中的panic和recover(捕获异常) 参考文章: (1)Golang中的panic和recover(捕获异常) (2)https://www.cnblogs.com/zhzhlong ...

  5. golang 中string和int类型相互转换

    总结了golang中字符串和各种int类型之间的相互转换方式: string转成int: test_int, err := strconv.Atoi(test_string) if err != ni ...

  6. golang中并发sync和channel

    golang中并发sync和channel chenbaoke · 2014-12-08 13:00:01 · 19151 次点击 · 预计阅读时间 5 分钟 · 不到1分钟之前 开始浏览 这是一个创 ...

  7. golang中的sync.WaitGroup

    golang中的sync.WaitGroup Posted on 2015/04/09刚才看golang的sync的包,看见一个很有用的功能.就是WaitGroup. 先说说WaitGroup的用途: ...

  8. 初步解读Golang中的接口相关编写方法

    初步解读Golang中的接口相关编写方法 概述如果说goroutine和channel是Go并发的两大基石,那么接口是Go语言编程中数据类型的关键.在Go语言的实际编程中,几乎所有的数据结构都围绕接口 ...

  9. golang中utf8和汉字互转

    golang中utf8和汉字互转 package mainimport ("fmt""strconv""strings" )func mai ...

最新文章

  1. bootstrap3中关于布局的两种样式
  2. python中nlp的库_单词袋简介以及如何在Python for NLP中对其进行编码
  3. pku 1077 Eight
  4. 约翰•麦卡锡——不走寻常路的常识逻辑学家
  5. Behavioral模式之Memento模式
  6. oracle 等频直方图,等频直方图预估结果集行计算公式
  7. Linux自学笔记——Centos系统安装
  8. 光纤收发器出现死机故障怎么解决
  9. [渝粤教育] 武汉交通职业学院 现代物流管理概论 参考 资料
  10. java jna jni_JNA, Java Native开发利器
  11. python数据结构剑指offer-替换空格
  12. 《Algorithms》Comparable 实现快速排序三向切分的快速排序
  13. 渐进式 Web 应用程序是移动开发的未来吗?
  14. sqlserver 2008r2 执行代码 快捷键
  15. non linear processor
  16. 图像处理中各种边缘检测的微分算子简单比较(Sobel,Robert, Prewitt,Laplacian,Canny)
  17. 宝马「试水」神经形态芯片
  18. 应用程序“xxx“不能打开,怎么解决?
  19. python RTL自动生成_实例16:用Python自动生成Excel档每日领料单
  20. 如何提升自己的宣传效果?从这两个点开始

热门文章

  1. php实现远程升级,教你如何用php实现LOL数据远程获取
  2. vue路由跳转子组件_vue跳转到子路由子路由的组件页面无法滚动
  3. 阿里巴巴用人标准 -----马云
  4. 深入理解Android中的Drawable类
  5. JBOSS 是什么东西
  6. G-Snake Rana
  7. Java中如何保留小数点后几位数字
  8. 荣耀3路由器设置虚拟服务器,荣耀路由3怎么设置上网?(电脑) | 192路由网
  9. 2017 蓝桥杯初赛 分巧克力
  10. 关于在iPhone上播放视频的问题