【笔记】Protobuf学习笔记

前言

GRPC的Protobuf学习笔记

下载依赖

MacOS

1
pip install protobuf

查看版本

1
protoc --version

注释

1
// 单行注释
1
/* 多行注释 */

指定Protobuf版本

1
syntax = "proto3";

定义包名

1
package <package_name>;

定义消息

  • 消息名首字母大写

定义基本类型

1
2
3
4
5
message 结构体名 {
string 字段名 = 1;
int32 字段名 = 2;
bool 字段名 = 3;
}

定义切片

1
2
3
message 结构体名 {
repeated string 字段名 = 1;
}

定义映射

1
2
3
message 结构体名 {
map <string, string> 字段名 = 1;
}

定义结构体嵌套

1
2
3
4
5
6
message 结构体名1 {
message 结构体名2 {
数据类型 字段名 = 1;
}
结构体名2 数据类型 字段名 = 2;
}

定义枚举

1
2
3
4
5
6
7
message 结构体名 {
enum Sex {
male = 0;
female = 1;
}
Sex 字段名 = 1;
}

允许多个值相同的枚举

1
2
3
4
5
6
7
8
9
message 结构体名 {
enum Sex {
option allow_alias = true;
male = 0;
female = 1;
girl = 1;
}
Sex 字段名 = 1;
}

定义OneOf

  • 每次只有一个字段可以被赋值
1
2
3
4
5
6
message 结构体名 {
oneof OneOf名 {
string 字段名1 = 1;
string 字段名2 = 2;
}
}

设置字段为保留字

通过字段名设置字段为保留字

1
2
3
message 结构体名 {
reserved "字段名";
}
保留多个
1
2
3
message 结构体名 {
reserved "字段名1", "字段名2";
}

通过唯一标识设置字段为保留字

1
2
3
message 结构体名 {
reserved 1;
}

引入其他Protobuf

dir/package_name.proto
1
2
3
4
5
6
7
syntax = "proto3";

package package_name;

message MessageName1 {
string field_name_1 = 1;
}
file.proto
1
2
3
4
5
6
7
syntax = "proto3";

import "dir/package_name.proto";

message MessageName2 {
package_name.MessageName1 field_name_2 = 1;
}

完成

参考文献

哔哩哔哩——go圈里最会写js的奇淼