码迷,mamicode.com
首页 > Web开发 > 详细

【Golang】读源码知 【encode/binary】

时间:2018-05-09 15:11:53      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:替代   string   类型   需要   结构   内存   并且   数据   windows   

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】

标签:替代   string   类型   需要   结构   内存   并且   数据   windows   

原文地址:https://www.cnblogs.com/lvhuatblog/p/9013254.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!