protobuf
protobuf
message关键字
类似于C++中的class,java中的class,go中struct,例如
在消息中承载的数据分别对应于每一个字段,
其中每个字段都有一个名字和一种类型。
message User {
string username = 1;
int32 age = 2;
}
字段规则
required:消息体中必须填写的字段。
optional:消息体中可选字段,在Go中会定义为对应类型的指针
repeated:消息体中可重复字段,重复的值的顺序会被保留,在Go中重复的会被定义为切片
message User{
string username = 1;
int32 age = 2;
optional string password =3;
repeated string addresses = 4;
}
字段映射
proto Type | Notes | Go |
---|---|---|
double | float64 | |
float | float32 | |
int32 | 使用变长编码,对于负值的效率很低,如果你的域中有可能有负值,请使用sint64替代 | int32 |
uint32 | 使用变长编码 | uint32 |
uint64 | 使用变长编码 | uint64 |
sint32 | 使用变长编码,这些编码在负值的时候比int32高效的多 | int32 |
sint64 | 使用变长编码,有符号的整型值,编码时比通常int64高效 | int64 |
fixed32 | 总是4个字节,如果数值总是比228大的话,这个类型会比uint32高效 | uint32 |
fixed64 | 总是8个字节,如果数值总是比256大的话,这个类型比uint64高效 | uint64 |
sfixed32 | 总是4个字节 | int32 |
sfixed64 | 总是8个字节 | int64 |
bool | bool | bool |
string | 一个字符串必须是utf-8编码或者7-bit ASCII编码的文本 | string |
bytes | 可能包含任意顺序的字节数据 | []byte |
默认值
类型 | 默认值 |
---|---|
bool | false |
整型 | 0 |
string | 空字符串 |
枚举enum | 第一个枚举元素的值,因为protobuf3强制要求第一个枚举元素的值必须是0,所以枚举的默认值就是0 |
message | 不是null,而是DEFALT_INSTANCE |
标识号
在消息体的定义中,每个字段都必须要有一个唯一的标识号,标识号是[0,2^29-1]范围中的一个整数。
message User {
string username = 1; # 这个1 就是标识号
int32 age = 2;
}
定义多个消息类型
一个proto文件中可定义多个消息类型
message UserRequest{ # 名称唯一
string username = 1;
int32 age = 2;
optional string password =3;
repeated string addresses = 4;
}
message UserResponse{ # 名称唯一
string username = 1;
int32 age = 2;
optional string password =3;
repeated string addresses = 4;
}
嵌套消息
可以在其他消息类型中定义,使用消息类型,Person消息就定义在Personinfo消息体内。
message PersonInfo {
message Person{
string name = 1;
int32 age = 2;
repeated string addresses = 3;
}
repeated Person info =1;
}
如果你想在它的父消息类型的外部重用这个消息类型,你就需要以PersonIfo.Person的形式使用它。
message PersonMessage {
PersonInfo.Person info = 1;
}
你也可以将消息嵌套任意多层,如:
message Grandpa {
message Father {
message son {
string name = 1;
int32 age =2;
}
}
}
定义服务
如果想要将消息类型用在RPC系统中,可以在.proto文件中定义一个RPC服务接口,protocol buffer编译器会将根据所选择的不同语言生成服务接口代码及存根。
service SearchService {
// rpc 服务的函数名(传入参数) 返回 返回参数
rpc Search(SearchRequest) returns (SearchResponse);
}
上诉代码表示,定义了一个RPC服务,该方法接收SearchRequest返回SearchResponse