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; //保留字段
}

  1. 第一行声明使用 proto3 语法。否则,默认使用 proto2 语法
  2. package 指令指明当前是 main 包,也可以针对不同的语言定制对应的包路径和名称
  3. message 关键字定义一个 Person 类型消息体,在最终生成的Go语言代码中对应一个 Person 结构体。每一个消息体的字段包含三个属性:类型、字段名称、字段编号。在消息体的定义上,除类型以外均不可重复。此处 Person 类型中有一个字符串类型的 name 成员,该成员编码时用1编号代替名字
  4. 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
}