分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

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

发布时间:2023-09-06 01:53责任编辑:傅花花关键词:暂无标签
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】

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

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved