Proto 文件语法
学习一下 proto 文件的语法和使用规则
一、定义语法
1.0、 示例
1 | // 指定proto语法版本 |
1.1、syntax
用来标记当前使用 proto 的哪个版本,如果不设置默认会使用 proto2
1.2、option
选项信息,生成的 Go 文件放在那个目录下面以及包名是什么
1.3、message
声明消息的关键字,类似 Go 语言中的 struct。消息中承载的数据分别对应于每一个字段,其中每个字段都有一个名字和一种类型个 proto 文件中可以定义多个消息类型。
字段规则
- required:消息体中必填字段,如果不设置就导致编码异常(protobuf2 中使用,在 protobuf3 中已经去除)
- optional:消息体中可选字段,protobuf3 中默认
- repeate:消息体中可重复字段,重复的值的顺序会被保留在 Go 中重复的会被定义为切片
- reserved:标记的标识号、字段名,都不能在当前消息中使用
- enum:定义枚举类型
- map:定义map类型
消息号
每个字段都有唯一的一个数字标识符,一旦开始使用就不能够再改变,范围是 [1,2^29-1]内的整数。
1.3、service
使用关键字 service 定义一个 RPC 服务接口,使用 rpc 定义具体方法,而消息类型则充当方法的参数和返回值。
1 | service HelloGrpc { |
二、Proto 类型与 Go 类型
.proto | Go | Notes |
---|---|---|
double | float64 | |
float | float32 | |
int32 | int32 | 对于负值的效率很低,如果有负值,使用sint64 |
uint32 | uint32 | 使用变长编码 |
uint64 | uint64 | 使用变长编码 |
sint32 | int32 | 负值时比int32高效的多 |
sint64 | int64 | 使用变长编码,有符号的整型值。编码时比通常的int64高效。 |
fixed32 | uint32 | 总是4个字节,如果数值总是比总是比228大的话,这个类型会比uint32高效。 |
fixed64 | uint64 | 是8个字节,如果数值总是比总是比256大的话,这个类型会比uint64高效。 |
三、简单使用
3.1、嵌套消息
proto 文件
1 | // 指定proto语法版本 |
Go 文件
1 | type User struct { |
3.2、切片
proto 文件
1 | // 指定proto语法版本 |
生成的 Go 文件
1 | type List struct { |
3.3、Map
proto 文件
1 | // 指定proto语法版本 |
Go 文件
1 | type MapList struct { |
3.4、枚举
proto 文件
1 | // 指定proto语法版本 |
Go 文件
1 | type EnumMsg_Gender int32 |
3.5、保留标识符
proto 文件
1 | // 指定proto语法版本 |
生成 Go 文件
1 | 会提示错误 |