golang中的gob
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相关推荐
- Golang中Buffer高效拼接字符串以及自定义线程安全Buffer
本文原创文章,转载注明出处,博客地址 https://segmentfault.com/u/to... 第一时间看后续精彩文章.觉得好的话,顺手分享到朋友圈吧,感谢支持. Go中可以使用"+ ...
- 如何在golang中关闭bufio.reader_Golang 并发模型系列:1. 轻松入门流水线模型
Go语言中文网,致力于每日分享编码.开源等知识,欢迎关注我,会有意想不到的收获! Golang作为一个实用主义的编程语言,非常注重性能,在语言特性上天然支持并发,它有多种并发模型,通过流水线模型系列文 ...
- go语言的iota是什么意思_关于Golang中的iota
快速一览 iota是Golang中提供的一个简化常量和枚举编程的标识符,合理的使用这个标识符可以让代码变得更简洁,省去大量的不必要的代码. 比如下面的这个常量定义 const ( a = 1 b = ...
- Golang中的panic和recover(捕获异常)
Golang中的panic和recover(捕获异常) 参考文章: (1)Golang中的panic和recover(捕获异常) (2)https://www.cnblogs.com/zhzhlong ...
- golang 中string和int类型相互转换
总结了golang中字符串和各种int类型之间的相互转换方式: string转成int: test_int, err := strconv.Atoi(test_string) if err != ni ...
- golang中并发sync和channel
golang中并发sync和channel chenbaoke · 2014-12-08 13:00:01 · 19151 次点击 · 预计阅读时间 5 分钟 · 不到1分钟之前 开始浏览 这是一个创 ...
- golang中的sync.WaitGroup
golang中的sync.WaitGroup Posted on 2015/04/09刚才看golang的sync的包,看见一个很有用的功能.就是WaitGroup. 先说说WaitGroup的用途: ...
- 初步解读Golang中的接口相关编写方法
初步解读Golang中的接口相关编写方法 概述如果说goroutine和channel是Go并发的两大基石,那么接口是Go语言编程中数据类型的关键.在Go语言的实际编程中,几乎所有的数据结构都围绕接口 ...
- golang中utf8和汉字互转
golang中utf8和汉字互转 package mainimport ("fmt""strconv""strings" )func mai ...
最新文章
- bootstrap3中关于布局的两种样式
- python中nlp的库_单词袋简介以及如何在Python for NLP中对其进行编码
- pku 1077 Eight
- 约翰•麦卡锡——不走寻常路的常识逻辑学家
- Behavioral模式之Memento模式
- oracle 等频直方图,等频直方图预估结果集行计算公式
- Linux自学笔记——Centos系统安装
- 光纤收发器出现死机故障怎么解决
- [渝粤教育] 武汉交通职业学院 现代物流管理概论 参考 资料
- java jna jni_JNA, Java Native开发利器
- python数据结构剑指offer-替换空格
- 《Algorithms》Comparable 实现快速排序三向切分的快速排序
- 渐进式 Web 应用程序是移动开发的未来吗?
- sqlserver 2008r2 执行代码 快捷键
- non linear processor
- 图像处理中各种边缘检测的微分算子简单比较(Sobel,Robert, Prewitt,Laplacian,Canny)
- 宝马「试水」神经形态芯片
- 应用程序“xxx“不能打开,怎么解决?
- python RTL自动生成_实例16:用Python自动生成Excel档每日领料单
- 如何提升自己的宣传效果?从这两个点开始