ptotobuf 编码

本文详细介绍了protobuf的编码机制,包括protobuf的特点、结构体、编码方式如Varints和ZigZag编码,以及字段编号和传输类型。还讨论了protobuf在效率上的考虑,如对负数和默认值的特殊处理。
摘要由CSDN通过智能技术生成

1.引入
grpc 一款默认采用Proto 作为接口描述语言的一个RPC实现方案

Protobuf主要用于不同的编程语言的协作RPC场景下,定义需要序列化的数据格式。Protobuf本质上仅仅是一种用于交互的结构式定义,从功能上和XML、JSON等各种其他的交互形式都并无本质不同,只负责定义不负责数据编解码

Protobuf 特点:

效率高
支持跨平台、多语言
扩展性、兼容性好
使用简单
可读性差,缺乏自描述
本文针对效率问题进行一下简单的分析

  1. pb.go文件
    go语言在使用 protovuf 时候会生成一个pb 点 go文件

对于版本的支持
const (

// protoimpl.EnforceVersion 自定义的unint,来判断当前版本是需要重新生产

// 生成的代码太旧,需要重新生成 protoc 版本太低
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)

//-运行时包太旧,需要更新,你的protobuf 版本太低
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
旧版本生成
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

2.结构体

type HelloRequest struct {
// 以下是protobuf自动填充的字段,protobuf需要使用
// state 保存 proto文件的反射信息 sizeCache序列化的数据总长度 unknownFields 不能解析的字段
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

Code int32  `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` // 说明这个字段是protobuf的varint类型,index为1 name为code,使用proto3协议  omitempty 忽略默认值 
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
B    bool   `protobuf:"varint,3,opt,name=B,proto3" json:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值