在写proto文件的时候,想要百度一下都有哪些内容,但是找到的都是那个经典的官方样例,互相之间抄来抄去,所以这里干脆把git上的相关源码,和实际使用经历结合总结下来,给一潭死水里注入一点活力吧。
1. syntax:指定proto文件使用的语法版本。
2. package:指定生成的代码所在的包名。
3. import:导入其他proto文件。
4. option:设置特定的选项。
5. message:定义消息类型。
6. enum:定义枚举类型。
7. service:定义服务接口。
8. rpc:定义远程过程调用方法。
9. oneof:定义互斥字段,只能选择其中一个字段。
10. map:定义映射类型,类似于字典。
11. repeated:定义重复字段,可以有多个值。
12. required:定义必需字段,必须有值。
13. optional:定义可选字段,可以有值也可以为空。
14. extensions:定义扩展字段。
15. extend:扩展已有的消息类型或枚举类型。
syntax = "proto3";
package mypackage;
import "google/protobuf/timestamp.proto";
option java_package = "com.example.mypackage";
message Person {
string name = 1;
int32 age = 2;
repeated string phone_numbers = 3;
}
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
service MyService {
rpc GetData (GetDataRequest) returns (GetDataResponse);
}
rpc GetData (GetDataRequest) returns (GetDataResponse);
message Person {
string name = 1;
oneof phone_number {
string mobile = 2;
string home = 3;
string work = 4;
}
}
message Person {
string name = 1;
map phone_numbers = 2;
}
message Person {
string name = 1;
repeated string phone_numbers = 2;
}
message Person {
required string name = 1;
required int32 age = 2;
}
message Person {
optional string name = 1;
optional int32 age = 2;
}
extend Person {
extensions 100 to 199;
optional string email_address = 100;
}
extend google.protobuf.Timestamp {
optional string timezone = 1000;
}
下面是一些示例,展示了proto文件中的嵌套、数组和以结构体为值的映射的用法:
syntax = "proto3";
message Address {
string street = 1;
string city = 2;
string state = 3;
}
message Person {
string name = 1;
int32 age = 2;
Address address = 3;
}
在上面的示例中,Address是一个嵌套在Person中的消息类型。
syntax = "proto3";
message Person {
string name = 1;
repeated string phone_numbers = 2;
}
在上面的示例中,phone_numbers字段是一个字符串数组。
syntax = "proto3";
message Person {
string name = 1;
map addresses = 2;
}
message Address {
string street = 1;
string city = 2;
string state = 3;
}
在上面的示例中,addresses字段是一个以字符串为键、Address结构体为值的映射。
syntax = "proto3";
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
CUSTOM = 3;
}
在上面的示例中,我们定义了一个自定义的枚举值CUSTOM。
syntax = "proto3";
message Person {
string name = 1;
extensions 100 to 199;
}
extend Person {
optional string email = 100;
}
在上面的示例中,我们使用extend关键字扩展了Person消息类型,添加了一个可选的email字段。
syntax = "proto3";
service MyService {
rpc GetData (GetDataRequest) returns (GetDataResponse);
rpc UpdateData (UpdateDataRequest) returns (UpdateDataResponse);
}
message GetDataRequest {
string id = 1;
}
message GetDataResponse {
string data = 1;
}
message UpdateDataRequest {
string id = 1;
string newData = 2;
}
message UpdateDataResponse {
bool success = 1;
}
在上面的示例中,我们定义了一个名为MyService的服务,其中包含了两个RPC方法:GetData和UpdateData。每个RPC方法都有对应的请求消息和响应消息。
分享一个有趣的 学习链接:https://xxetb.xet.tech/s/HY8za