ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
### 4.4 protobuf语法 protobuf 通常会把用户定义的结构体类型叫做一个消息,这里我们遵循惯例,统一称为消息。protobuf 消息的定义(或者称为描述)通常都写在一个以 .proto 结尾的文件中。 ##### A\) 一个简单的例子 ```protobuf syntax = "proto3"; //指定版本信息,不指定会报错 package pb; //后期生成go文件的包名 //message为关键字,作用为定义一种消息类型 message Person { string name = 1; //姓名 int32 age = 2; //年龄 repeated string emails = 3; //电子邮件(repeated表示字段允许重复) repeated PhoneNumber phones = 4; //手机号 } //enum为关键字,作用为定义一种枚举类型 enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } //message为关键字,作用为定义一种消息类型可以被另外的消息类型嵌套使用 message PhoneNumber { string number = 1; PhoneType type = 2; } ``` ##### B\) 消息格式说明 消息由字段组成,每个消息的字段格式为: (字段修饰符 +)数据类型 + 字段名称 + 唯一的编号标签值; * 字段名称:蛇形或者驼峰 * 唯一的编号标签:代表每个字段的一个唯一的编号标签,在同一个消息里不可以重复。这些编号标签用与在消息二进制格式中标识你的字段,并且消息一旦定义就不能更改。需要说明的是标签在1到15范围的采用一个字节进行编码,所以通常将标签1到15用于频繁发生的消息字段。编号标签大小的范围是1到229 * 注释格式:向.proto文件添加注释,可以使用C/C++/java/Go风格的双斜杠(//) 语法格式 ##### C\) 数据类型 | **.proto Type** | **Go Type** | **Notes** | | :--- | :--- | :--- | | double | float64 | 64位浮点数 | | float | float32 | 32位浮点数 | | int32 | int32 | 使用变长编码,对于负值的效率很低,如果你的域有可能有负值,请使用sint64替代 | | uint32 | uint32 | 使用变长编码 | | uint64 | uint64 | 使用变长编码 | | sint32 | int32 | 使用变长编码,这些编码在负值时比int32高效的多 | | sint64 | int64 | 使用变长编码,有符号的整型值。编码时比通常的int64高效。 | | fixed32 | uint32 | 总是4个字节,如果数值总是比总是比228大的话,这个类型会比uint32高效。 | | fixed64 | uint64 | 总是8个字节,如果数值总是比总是比256大的话,这个类型会比uint64高效。 | | sfixed32 | int32 | 总是4个字节 | | sfixed32 | int32 | 总是4个字节 | | sfixed64 | int64 | 总是8个字节 | | bool | bool | | | string | string | 一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本。 | | bytes | \[\]byte | 可能包含任意顺序的字节数据。 | 更多详情请看:[https://developers.google.com/protocol-buffers/docs/encoding](https://developers.google.com/protocol-buffers/docs/encoding) ##### D\) 默认缺省值 当一个消息被解析的时候,如果被编码的信息不包含一个特定的元素,被解析的对象锁对应的域被设置位一个默认值,对于不同类型指定如下: * 对于strings,默认是一个空string * 对于bytes,默认是一个空的bytes * 对于bools,默认是false * 对于数值类型,默认是0