一、proto语法
关键词 |
注释 |
syntax |
指定版本,一般用“proto3” |
package |
指定默认包名 |
service |
对应的go里面的接口,可以作为服务端,客户端 |
rpc |
对应结构体中的方法 |
message |
对应的结构体 |
二、proto中的标量类型
标量类型 |
对应go类型 |
解释 |
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高效 |
sfixed32 |
int32 |
总是4个字节 |
sfixed64 |
int64 |
总是8个字节 |
bool |
bool |
|
string |
string |
一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本 |
bytes |
[]byte |
可能包含任意顺序的字节数据 |
标量类型如果没有被赋值,则不会被序列化,解析时,会赋予默认值
- strings:空字符串
- bytes:空序列
- bools:false
- 数值类型:0
三、proto中的数组类型
关键词repeated
,示例中的Request
为结构体,repeated Request
表示Request
结构体数组 示例:
message ArrayRequest {
repeated int64 a1 = 1;
repeated string a2 = 2;
repeated Request request_list = 3;
}
对应go类型
type ArrayRequest struct {
A1 []int64
A2 []string
RequestList []*Request
}
四、proto中的Map类型
关键词map
,键只能是标量类型
示例:
message MapRequest {
map<int64, string> m_i_s = 1;
map<string, bool> m_i_b = 2;
map<string, ArrayRequest> m_i_arr = 3;
}
对应go类型
type MapRequest struct {
MIS map[int64]string
MIB map[string]bool
MIArr map[string]*ArrayRequest
}
五、proto中的嵌套类型
Q2结构体即为内嵌结构体,可以把它比作java的内部类
示例:
message Q1 {
message Q2{
string name2 = 2;
}
string name1 = 1;
Q2 q2 = 2;
}
对应go类型
type Q1 struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Name1 string `protobuf:"bytes,1,opt,name=name1,proto3" json:"name1,omitempty"`
Q2 *Q1_Q2 `protobuf:"bytes,2,opt,name=q2,proto3" json:"q2,omitempty"`
}
六、proto中的编写风格
- 文件名建议下划线,例如:
my_student.proto
- 包名和目录名对应,例如:
package hello_grpc
对应hello_grpc
目录 - 服务名、方法名、消息名均为大驼峰,例如:
service HelloService、rpc SayHello、message HelloRequest
- 字段名为下划线,例如:
string user_id = 1