Protobuf的基本语法
消息类型(messgae)
消息是Protobuf中的基本构建块,类似于其他语言中的类。消息类型定义了一系列字段,这些字段可以是简单类型或者其他消息类型。每一个messgae都会有一个或者多个字段(field),其中字段包含如下元素
syntax = "proto3"; // 指定Protobuf的版本,这里是proto3
package main;
// 定义一个消息类型
message Person {
string name = 1; // 字段定义,包括字段类型、名称和标签号
int32 id = 2; // 标签号在消息类型中唯一
string email = 3;
repeated string sing = 4;
reserved 10,11; //保留字段
}
- 第一行声明使用 proto3 语法。否则,默认使用 proto2 语法
- package 指令指明当前是 main 包,也可以针对不同的语言定制对应的包路径和名称
- message 关键字定义一个
Person
类型消息体,在最终生成的Go语言代码中对应一个Person
结构体。每一个消息体的字段包含三个属性:类型、字段名称、字段编号。在消息体的定义上,除类型以外均不可重复。此处Person
类型中有一个字符串类型的 name 成员,该成员编码时用1编号代替名字 - Protobuf 中最基本的数据单元是 message,类似 Go 语言中的结构体。在 message 中可以嵌套 message 或其它的基础数据类型的成员
字段名比较推荐的是使用下划线/分隔名称
基本数据类型
.proto Type | Go Type | Notes |
---|---|---|
double | float64 | |
float | float32 | |
int32 | int32 | 使用可变长度的编码。对负数的编码效率低下 - 如果您的字段可能包含负值,请改用 sint32。 |
int64 | int64 | 使用可变长度的编码。对负数的编码效率低下 - 如果字段可能有负值,请改用 sint64。 |
uint32 | uint32 | 使用可变长度的编码。 |
uint64 | uint64 | 使用可变长度的编码。 |
sint32 | int32 | 使用可变长度的编码。有符号整数值。与常规 int32 相比,这些函数可以更高效地对负数进行编码。 |
sint64 | int64 | 使用可变长度的编码。有符号整数值。与常规 int64 相比,这些函数可以更高效地对负数进行编码。 |
fixed32 | uint32 | 始终为 4 个字节。如果值通常大于 2^28,则比 uint32 更高效。 |
fixed64 | uint64 | 始终为 8 个字节。如果值通常大于 2^56,则比 uint64 更高效。 |
sfixed32 | int32 | 始终为 4 个字节。 |
sfixed64 | int64 | 始终为 8 个字节。 |
bool | bool | |
string | string | 字符串必须始终包含 UTF-8 编码或 7 位 ASCII 文本,并且长度不得超过 2^32。 |
bytes | []byte | 可以包含任意长度的 2^32 字节。 |
复合类型
数组
message SearchResponse {
repeated Result results = 1; // SearchResponse 包含一个名为 results 的字段,该字段可以重复多次,表示可以有多个搜索结果。每个搜索结果都是 Result 类型。
}
message Result {
string url = 1; // Result 消息包含一个名为 url 的字段,该字段的类型为 string,用于存储搜索结果的 URL。
string title = 2; // Result 消息还包含一个名为 title 的字段,该字段的类型为 string,用于存储搜索结果的标题。
repeated string snippets = 3; // Result 消息包含一个可重复的名为 snippets 的字段,该字段的类型为 string,可以包含多个片段,这些片段是搜索结果的文本摘要或高亮显示的关键字。
}
枚举类型
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
string number = 1;
PhoneType type = 2; // 枚举类型作为字段
}
服务
service SearchService {
rpc Search(SearchRequest) returns (SearchResponse);
}
- 定义了一个名为 SearchService 的服务,它包含一个名为 Search 的RPC方法。这个方法接受一个 SearchRequest 类型的消息作为输入,并返回一个 SearchResponse 类型的消息作为输出。
- SearchRequest: 这是一个之前定义的消息类型,包含了执行搜索所需的所有参数,如搜索查询字符串、页码、每页结果数等。SearchResponse: 这也是一个之前定义的消息类型,它包含了搜索结果,如一系列搜索结果等。
使用其他消息类型
syntax = "proto3"; // 指定了使用proto3版本的语法
import "google/protobuf/wrappers.proto"; // 导入了包装类型,这些是可空的版本的基础类型
package ecommerce; // 定义了一个包名称,用于防止命名冲突
// 定义了一个名为 Order 的消息类型
message Order {
string id = 1; // 订单的唯一标识符
repeated string items = 2; // 订单中的商品项列表,可以有多个
string description = 3; // 订单的描述信息
float price = 4; // 订单的总价格
google.protobuf.StringValue destination = 5; // 订单的目的地,使用了包装类型StringValue
}