跳过正文

Protobuf语法

·441 字
目录

官方文档
#

https://protobuf.dev/programming-guides/proto3/

protobuf 基本类型
#

protobuf 类型Go 类型Java 类型Python 类型PHP 类型描述
doublefloat64doublefloatfloat
floatfloat32floatfloatfloat
int32int32intintinteger
int64int64longint/longinteger/string
uint32uint32intint/longinteger
uint64uint64longint/longinteger/string
sint32int32intintinteger负数序列化效率更高
sint64int64longint/longinteger/string负数序列化效率更高
fixed32uint32intint/longinteger固定 4 字节,大于 2^28 次方时效率比 uint32 高
fixed64uint64longint/longinteger/string固定 8 字节,大于 2^56 次方时效率比 uint64 高
sfixed32int32intintinteger固定 4 字节
sfixed64int64longint/longinteger/string固定 8 字节
boolboolbooleanboolboolean
stringstringStringstringstring长度小于 2^32
bytes[]byteByteStringstr(Python2)/bytes(Python3)string长度小于 2^32

enum 类型

enum 类型必须有 0 值,且 0 值必须是第一个元素

原因如下

0 是数值类型的默认值

proto2 语法将第一个元素作为默认值

enum Corpus {
  CORPUS_UNSPECIFIED = 0;
  CORPUS_UNIVERSAL = 1;
  CORPUS_WEB = 2;
  CORPUS_IMAGES = 3;
  CORPUS_LOCAL = 4;
  CORPUS_NEWS = 5;
  CORPUS_PRODUCTS = 6;
  CORPUS_VIDEO = 7;
}

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
  Corpus corpus = 4;
}

map 类型

map<string, Project> projects = 3;

map 类型不可以使用 repeated

另一种实现方式

message MapFieldEntry {
  key_type key = 1;
  value_type value = 2;
}

repeated MapFieldEntry map_field = N;

定义 message
#

syntax = "proto2";

message UserReq {
    required uint64 uuid = 1; // uuid
}

message UserResp {
    optional string name = 1; // 姓名
    optional uint32 age  = 2; // 年龄
}
syntax = "proto3";

package = "xxx";

go_package = "xxxx";

message UserReq {
    uint64 uuid = 1; // uuid
}

message UserResp {
    string name = 1; // 姓名
    uint32 age  = 2; // 年龄
}

定义 service
#

service FooService {
  rpc GetSomething(GetSomethingRequest) returns (GetSomethingResponse);
  rpc ListSomething(ListSomethingRequest) returns (ListSomethingResponse);
}

导入其他proto文件
#

import "myproject/path/other.proto"

生成各种语言 pb 文件
#

protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR --java_out=DST_DIR --python_out=DST_DIR --go_out=DST_DIR --ruby_out=DST_DIR --objc_out=DST_DIR --csharp_out=DST_DIR path/to/file.proto