Golang读源码知 encode/binary
Posted lvhuatblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang读源码知 encode/binary相关的知识,希望对你有一定的参考价值。
go version go1.9.2 windows/amd64
如果你觉得xml,json等不能满足你程序的需要,那么你可能用到传统的二进制协议来作为服务之间数据协议
1. 顶层结构可以是基本类型或者是基本类型的切片
2. 可以指定大小端规则
4. 定长,当时结构体的时候,整个结构的大小,也就是最终变成bytes的长度时已经固定的,换而言之,不支持任何变长的类型,例如slice,string,map...,替代的可能是各种各样的数组。
5. 疑惑,虽然结构体是定长的,但是从源代码来看,依然每次序列化的时候,依然会去计算一次数据的长度,但是根据bench测试,其效果差距也不算大,但是对于c/c++端的序列化和反序列化就有十分大的优化了,因为结构体本身不需要序列化,只需要拷贝内存就可以了。
与ProtoBuffer序列化相比:
encode/binary序列化计算过程
1. 计算长度,遍历每个字段来递归。
2. 递归每个字段得值,向Buffer写入数据
protobuf 序列化计算过程:
1. 读取类型,并且解析tag(会根据类型缓存)
2. 针对每个字段按tag得顺序进行编码。
1. 应用灵活性,ProtoBuffer 提供更加灵活的支持,不会随着语言不同而不同的定义。定义一个结构体,那么golang和c/c++的定于就需要自己调整,来保证适配,如果是其他的语言,则需要根据每个语言自己的特色来做协议的序列化和反序列化;
2. 数据长度,使用binary的结构体(大部分都会是这种情况),意味着结构体是定长的,也就是说如果你需要变长的效果,就需要一个更大容量的数组和一个数组中数据实际的长度来维护。但是整个数组在传递的时候依然会传输;
3. 效率,当protobuffer有大量零值时,protobuffer更加优秀,随着零值得减少,binary逐渐趋近protobuffer(binary对每个字段得序列化计算损耗低于protobuffer),并且实现微弱得反超
以上是关于Golang读源码知 encode/binary的主要内容,如果未能解决你的问题,请参考以下文章