关于protobuf:protobuf2-消息类型

根本数据类型

syntax = "proto3";

// 所有根本数据类型
// protoc --go_out=. scalar.proto
option go_package = "../service";

message scalar{
  double filed1 = 1;  //float64
  float field2 = 2;   //float32
  int32 field3 = 3;   //int32
  int64 field4 = 4;   //int64
  uint32 field5 = 5;  //uint32
  uint64 field6 = 6;  //uint64
  sint32 field7 = 7;  //int32
  sint64 field8 = 8;  //int64
  fixed32 field9 = 9; //uint32
  fixed64 field10 = 10; //uint64
  sfixed32 field11 = 11; //int32
  sfixed64 field12 = 12; //int64
  bool field13 = 13;  //bool
  string  field14 = 14; //string
  bytes field15 = 15;  //[]byte
}

生成的go代码

枚举类型

syntax = "proto3";

// protoc --go_out=. enumerations.proto
option go_package = "../service";

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
  enum Corpus {
    UNIVERSAL = 0;
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
  }
  Corpus corpus = 4;
}

生成的go代码

其余音讯类型

syntax = "proto3";

// protoc --go_out=. other_message_type.proto
option go_package = "../service";

message SearchResponse {
  repeated Result results = 1;
}

message Result {
  string url = 1;
  string title = 2;
  repeated string snippets = 3;
}

如果应用的类型定义在其余proto文件中,须要import导入

嵌套类型

syntax = "proto3";

// protoc --go_out=. nested.proto
option go_package = "../service";

message NestedSearchResponse {
  message Result {
    string url = 1;
    string title = 2;
    repeated string snippets = 3;
  }
  repeated Result results = 1;
}

更新音讯类型

有时候你不得不批改正在应用的proto文件,比方为类型减少一个字段,protobuf反对这种批改而不影响已有的服务,不过你须要遵循肯定的规定:

  • 不要扭转已有字段的字段编号
  • 当你减少一个新的字段的时候,老零碎序列化后的数据仍然能够被你的新的格局所解析,只不过你须要解决新加字段的缺省值。 老零碎也能解析你信息的值,新加字段只不过被抛弃了
  • 字段也能够被移除,然而倡议你Reserved这个字段,防止未来会应用这个字段
  • int32, uint32, int64, uint64 和 bool类型都是兼容的
  • sint32 和 sint64兼容,然而不和其它整数类型兼容
  • string 和 bytes兼容,如果 bytes 是非法的UTF-8 bytes的话
  • 嵌入类型和bytes兼容,如果bytes蕴含一个音讯的编码版本的话
  • fixed32和sfixed32, fixed64和sfixed64
  • enum和int32, uint32, int64, uint64格局兼容
  • 把繁多一个值扭转成一个新的oneof类型的一个成员是平安和二进制兼容的。把一组字段变成一个新的oneof字段也是平安的,如果你确保这一组字段最多只会设置一个。把一个字段挪动到一个已存在的oneof字段是不平安的

参考

  • https://developers.google.com…
  • https://colobu.com/2019/10/03…

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理