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

go version 
go1.9.2 windows/amd64

如果你觉得xml,json等不能满足你程序的需要,那么你可能用到传统的二进制协议来作为服务之间数据协议

1. 顶层结构可以是基本类型或者是基本类型的切片

2. 可以指定大小端规则

4. 定长,当时结构体的时候,整个结构的大小,也就是最终变成bytes的长度时已经固定的,换而言之,不支持任何变长的类型,例如slice,string,map...,替代的可能是各种各样的数组。

与ProtoBuffer相比:

1. 应用灵活性,ProtoBuffer 提供更加灵活的支持,不会随着语言不同而不同的定义。定义一个结构体,那么golang和c/c++的定于就需要自己调整,来保证适配,如果是其他的语言,则需要根据每个语言自己的特色来做协议的序列化和反序列化;

2. 数据长度,使用binary的结构体(大部分都会是这种情况),意味着结构体是定长的,也就是说如果你需要变长的效果,就需要一个更大容量的数组和一个数组中数据实际的长度来维护。但是整个数组在传递的时候依然会传输;

3. 效率,如果使用golang的binary可能并不是一个好的选择,虽然结构体是定长的,但是从源代码来看,依然每次序列化的时候,依然会去计算一次数据的长度,但是根据bench测试,其效果差距也不算大,但是对于c/c++端的序列化和反序列化就有十分大的优化了,因为结构体本身不需要序列化,只需要拷贝内存就可以了。

扫描二维码关注公众号,回复: 196112 查看本文章

猜你喜欢

转载自www.cnblogs.com/lvhuatblog/p/9013254.html