syntax
ProtoBuf 有两个语言版本:v2 与 v3,截止目前在使用 v3 的时候,需要在 *.proto 文件首行中明文标识 syntax:
person.proto:
syntax="proto3";
message Person {
int64 id = 1;
string name = 2;
}
如果使用的是 v2 ,在首行可以缺省 syntax 标识,或者指定 syntax="proto2"; 都可以:
person.proto:
message Person {
int64 id = 1;
string name = 2;
}
v3 与 v2 在语法上有一些区别例如:v3 去除了 optional、required 等,在语法上更为的简洁,我们这里主要介绍 v3,所以对 v2 就不做过多介绍了。
message
message 用来定义一个数据结构
- 命名:常规的命名方式建议使用驼峰法,即:HelloWorld 样式
- 注释: message 中支持 // 这样的单行注释
- repeated 的使用:被 repeated 标识的字段可以理解为是一个数组,示例:
message Person {
int64 id = 1;
string name = 2;
repeated string skills = 3; // 这里表示 skills 可以接受多个 string 类型的值
}
- enum 类型使用:枚举用来表示一定范围内具有相同属性的值,示例:
syntax = "proto3";
message Employee {
int64 id = 1;
string name = 2;
enum Skills {
GOLANG = 0;
PYTHON = 1;
JAVA = 2;
RUST = 3;
CPP = 4;
}
Skills skill = 3;
}
- message 类型的使用: message 在定义过程中是可以声明自己定义的 message 类型,示例:
syntax = "proto3";
message Employee {
int64 id = 1;
string name = 2;
Skill skills = 3; //这里声明的为自定义的 Skill 类型
}
message Skill {
string name = 1;
}
- map 类型的使用:message 定义时可以使用 map 类型,示例:
syntax = "proto3";
message Employee {
int64 id = 1;
string name = 2;
map<string, Skill> skills = 3;
}
message Skill {
string name = 1;
}
package
每个 *.proto 文件可以指定 package 作为生成语言的 namespace,示例:
syntax = "proto3";
package exmple;
message Employee {
int64 id = 1;
string name = 2;
map<string, Skill> skills = 3;
}
message Skill {
string name = 1;
}