举例
syntax = "proto3";
import public "other.proto";
package go.micro.hello;
service Greeter {
//Hello请求的定义
rpc Hello(HelloRequest) returns (HelloResponse) {}
}
message HelloRequest {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
map<string, PhoneNumber> phoneNums=5;
}
message HelloResponse {
string greeting = 2;
}
语法声明
文件的第一行声明了后面使用proto3的语法,如果没有该行,程序将默认为proto2的语法。
注意:该行需要是非空非注释的第一行
syntax = "proto3";
导入其他Proto文件定义
import public "other.proto";
public 可选择的属性有weak,public
防止多个消息类型命名冲突
package go.micro.hello;
定义服务
service Greeter {
//Hello请求的定义
rpc Hello(HelloRequest) returns (HelloResponse) {}
}
注释
使用两条斜杠 “//” 即可
或者使用/* … */
//Hello请求的定义
定义字段
required string name = 1;
字段规则
required
一个良好的消息格式至少存在一个这种字段。表示该值是必须要设置的。
数据发送方和接收方都必须处理这个字段。
optional
一个良好的消息格式有0个或1个这种字段(但不超过一个)。
在protobuf处理的时候另外加上了bool变量,用来标记这个字段是否有值,如果有值,那么就会给bool变量标记为true,否则标记为false。
repeated
一个良好的消息格式该字段可以重复任意次数(包括零次)。
在protobuf处理的时候加了count计数变量,用来标记这个字段有多少个。
默认值
如果三种规则都没有定义,那么如果没有携带该字段的消息,那么会以默认值代替。如bool型会以false代替;numeric型会以0代替
字段类型
bool, int32, uint32, bytes, float, double, string, messageType, enumType, map