学习链接:https://www.jianshu.com/p/f6ff6381a81a

这里每个字段都定义了一个唯一的数值标签。 这些唯一的数值标签用来标识 二进制消息 中你所定义的字段,一旦定义了编译后就无法修改。需要特别提醒的是标签 1–15 标识的字段编码仅占用 1 个字节(包括字段类型和标识标签)。 数值标签 16–2047 标识的字段编码占用 2 个字节。因此,你应该将标签 1–15 留给那些在你的消息类型中使用频率高的字段。记得预留一些空间(标签 1–15)给将来可能添加的高频率字段。


最小的数值标签是 1, 最大值是 2 29 - 1, 即 536,870,911。 你不能使用的标签范围还有:19000–19999。同样地,你不能使用保留字段中 reserved 关键字定义的标签。


消息的字段的规则:
单数(默认):该字段可以出现 0 或 1 次(不能大于 1 次)。
可重复(repeated):该字段可以出现任意次(包含 0)。 可重复字段数值的顺序是系统预定义的。
由于一些历史原因,默认情况下,数值类型的可重复(repeated)字段的编码性能没有想象中的好,你应该在其后用特殊选项 [packed=true] 来申明以获得更高效的编码。 例如:
repeated int32 samples = 4 [packed=true];


Required: 表示是一个必须字段,必须相对于发送方,在发送消息之前必须设置该字段的值,对于接收方,必须能够识别该字段的意思。发送之前没有设置required字段或者无法识别required字段都会引发编解码异常,导致消息被丢弃。


Optional:表示是一个可选字段,可选对于发送方,在发送消息时,可以有选择性的设置或者不设置该字段的值。对于接收方,如果能够识别可选字段就进行相应的处理,如果无法识别,则忽略该字段,消息中的其它字段正常处理。---因为optional字段的特性,很多接口在升级版本中都把后来添加的字段都统一的设置为optional字段,这样老的版本无需升级程序也可以正常的与新的软件进行通信,只不过新的字段无法识别而已,因为并不是每个节点都需要新的功能,因此可以做到按需升级和平滑过渡。


Repeated:表示该字段可以包含0~N个元素。其特性和optional一样,但是每一次可以包含多个值。可以看作是在传递一个数组的值。repeated 代表可重复,我们可以理解为数组.


当你想删除一个字段的时候,可以使用 reserved 关键字来申明该字段的标签(和/或名字,这在 JSON 序列化的时候也会产生问题)。 将来如果有人使用了你使用 reserved 关键字定义的标签或名字,编译器就好报错。