系列文章目录
第一章 grpc基本概念与安装
第二章 grpc入门示例
第三章 proto文件数据类型
第四章 多服务示例
第五章 多proto文件示例
第六章 服务器流式传输
第七章 客户端流式传输
第八章 双向流示例
文章目录
一、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
结构体数组
示例:
proto
message ArrayRequest {
repeated int64 a1 = 1;
repeated string a2 = 2;
repeated Request request_list = 3;
}
对应go类型
go
type ArrayRequest struct {
A1 []int64
A2 []string
RequestList []*Request
}
四、proto中的Map类型
关键词map
,键只能是标量类型
示例:
proto
message MapRequest {
map<int64, string> m_i_s = 1;
map<string, bool> m_i_b = 2;
map<string, ArrayRequest> m_i_arr = 3;
}
对应go类型
go
type MapRequest struct {
MIS map[int64]string
MIB map[string]bool
MIArr map[string]*ArrayRequest
}
五、proto中的嵌套类型
Q2结构体即为内嵌结构体,可以把它比作java的内部类
示例:
proto
message Q1 {
message Q2{
string name2 = 2;
}
string name1 = 1;
Q2 q2 = 2;
}
对应go类型
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
完成ヾ(◍°∇°◍)ノ゙