前言
在写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:
syntax = "proto3";
- package:
package mypackage;
- import:
import "google/protobuf/timestamp.proto";
- option:
option java_package = "com.example.mypackage";
- message:
message Person { string name = 1; int32 age = 2; repeated string phone_numbers = 3; }
- enum:
enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; }
- service:
service MyService { rpc GetData (GetDataRequest) returns (GetDataResponse); }
- rpc:
rpc GetData (GetDataRequest) returns (GetDataResponse);
- oneof:
message Person { string name = 1; oneof phone_number { string mobile = 2; string home = 3; string work = 4; } }
- map:
message Person { string name = 1; map<string, string> phone_numbers = 2; }
- repeated:
message Person { string name = 1; repeated string phone_numbers = 2; }
- required:
required:
- optional:
message Person { optional string name = 1; optional int32 age = 2; }
- extensions:
extend Person { extensions 100 to 199; optional string email_address = 100; }
- extend:
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<string, Address> 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字段。
- 服务定义和RPC方法:
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