一、编码规范推荐
1、文件名使用小写下划线的命名风格,例如 lower_snake_case.proto
2、使用 2 个空格缩进
3、包名应该和目录结构对应
4、消息名使用首字母大写驼峰风格(CamelCase),例如message StudentRequest { ... }
5、字段名使用小写下划线的风格,例如 string status_code = 1
6、枚举类型,枚举名使用首字母大写驼峰风格,例如 enum FooBar
7、RPC 服务名和方法名,均使用首字母大写驼峰风格,例如service FooService{ rpc GetSomething() }
二、protoC 执行命令
protoc --go_out=. *.proto
三、标量类型表
四、使用语法案例
// 使用proto3版本
syntax = "proto3";
// 可选,防止不同的消息类型有命名冲突
package main;
// 指定go的包名,会在当前目录生成一个main目录,然后里面存放*.pb.go文件
option go_package = "main";
// 导入其他的proto文件
import "mypro/other.proto";
// message是关键词,Student是类型名,后续生成一个Student的结构体
message Student {
// 格式:类型 字段名 = 数字标识符,每个标识符是唯一的
string name = 1;
// repeated代表字段可重复,对应Student结构体里的字段:Scores []int32
repeated int32 scores = 3;
// 定义一个map,键是string,值是int32
map<string, int32> points = 1;
// 指定了一些字段编号不应该被再次使用。这意味着在 Foo 消息的定义中,你不能再使用字段编号 2、15 以及 9 到 11(包括 9 和 11)来添加新的字段
reserved 2, 15, 9 to 11;
// 指定了一些字段名称不应该被再次使用。这意味着在 Foo 消息的定义中,你不能再使用字段名称 foo 或 bar 来添加新的字段。
reserved "foo", "bar";
// 枚举类型
enum Gender {
// 开启别名alias 选项:允许为不同的枚举值赋予相同的标识符
option allow_alias = true;
// 枚举类型的第一个选项标识符必须是0,也是枚举类型默认值
FEMALE = 0;
MALE = 1;
// 开启别名选项后
OTHER = 1;
}
Gender gender = 2;
// 嵌套另一个message作为消息类型,这里会生成 Results []*Student_Result 类似这样的切片
repeated Result results = 1;
// 也支持直接嵌套写message
message Result {
string url = 1;
string title = 2;
repeated string snippets = 3;
}
message ErrorStatus {
string message = 1;
// 标识details字段可以属于任何类型(可以是string int等),生成类似 []*anypb.Any 这样的切片,记得要在前面import "google/protobuf/any.proto"
repeated google.protobuf.Any details = 2;
}
//todo 确保在消息的实例中,只有 oneof 定义的字段中的一个字段被赋值。这是一种类型安全的方式来表示一个字段是多个可能类型的其中之一,而不是多个字段可以同时被赋值。
//在你提供的 protobuf 程序中,SampleMessage 消息定义了一个名为 test_oneof 的 oneof。这意味着在任何给定的 SampleMessage 实例中,只有 name 字段或 sub_message 字段可以被设置,而不能同时设置两者。
oneof test_oneof {
string name = 4;
SubMessage sub_message = 9;
}
//如果消息类型是用来远程通信的(Remote Procedure Call, RPC),可以在 .proto 文件中定义 RPC 服务接口。
//例如我们定义了一个名为 SearchService 的 RPC 服务,提供了 Search 接口,入参是 SearchRequest 类型,返回类型是 SearchResponse
service SearchService {
rpc Search (SearchRequest) returns (SearchResponse);
}
}
message Result {
string url = 1;
string title = 2;
repeated string snippets = 3;
}