protoc go插件编写之三 (自定义选项)


当前第2页 返回上一页

在protobuf protocol 中,可以为每种构造定义自定义选项。这是使用各种选项的示例:

import "google/protobuf/descriptor.proto";

extend google.protobuf.FileOptions {
  optional string my_file_option = 50000;
}
extend google.protobuf.MessageOptions {
  optional int32 my_message_option = 50001;
}
extend google.protobuf.FieldOptions {
  optional float my_field_option = 50002;
}
extend google.protobuf.OneofOptions {
  optional int64 my_oneof_option = 50003;
}
extend google.protobuf.EnumOptions {
  optional bool my_enum_option = 50004;
}
extend google.protobuf.EnumValueOptions {
  optional uint32 my_enum_value_option = 50005;
}
extend google.protobuf.ServiceOptions {
  optional MyEnum my_service_option = 50006;
}
extend google.protobuf.MethodOptions {
  optional MyMessage my_method_option = 50007;
}

option (my_file_option) = "Hello world!";

message MyMessage {
  option (my_message_option) = 1234;

  optional int32 foo = 1 [(my_field_option) = 4.5];
  optional string bar = 2;
  oneof qux {
    option (my_oneof_option) = 42;

    string quux = 3;
  }
}

enum MyEnum {
  option (my_enum_option) = true;

  FOO = 1 [(my_enum_value_option) = 321];
  BAR = 2;
}

message RequestType {}
message ResponseType {}

service MyService {
  option (my_service_option) = FOO;

  rpc MyMethod(RequestType) returns(ResponseType) {
    // Note:  my_method_option has type MyMessage.  We can set each field
    //   within it using a separate "option" line.
    option (my_method_option).foo = 567;
    option (my_method_option).bar = "Some string";
  }
}


请注意,如果要在自定义选项之外的其他程序包中使用自定义选项,则必须在选项名称前加上程序包名称,就像键入类型名称一样。例如:

  • foo.proto
import "google/protobuf/descriptor.proto";
package foo;
extend google.protobuf.MessageOptions {
  optional string my_option = 51234;
}
  • bar.proto
import "foo.proto";
package bar;
message MyMessage {
  option (foo.my_option) = "Hello world!";
}

最后一件事:由于自定义选项是扩展名,因此必须像其他任何字段或扩展名一样为它们分配字段编号。在上面的示例中,我们使用了范围为50000-99999的字段号。此范围保留供各个组织内部使用,因此您可以在内部应用程序中自由使用此范围内的数字。但是,如果您打算在公共应用程序中使用自定义选项,那么确保您的字段编号在全球范围内是唯一的,这一点很重要。要获取全局唯一的字段号,请发送请求以将条目添加到protobuf全局扩展注册表中。通常,您只需要一个分机号码。您可以通过将多个选项放在一个子消息中来声明多个仅具有一个分机号的选项:

message FooOptions {
  optional int32 opt1 = 1;
  optional string opt2 = 2;
}

extend google.protobuf.FieldOptions {
  optional FooOptions foo_options = 1234;
}

// usage:
message Bar {
  optional int32 a = 1 [(foo_options).opt1 = 123, (foo_options).opt2 = "baz"];
  // alternative aggregate syntax (uses TextFormat):
  optional int32 b = 2 [(foo_options) = { opt1: 123 opt2: "baz" }];
}

另外,请注意,每个选项类型(文件级,消息级,字段级等)都有自己的数字空间,例如您可以使用相同的编号声明FieldOptions和MessageOptions的扩展名。

参考文献:

  • https://developers.google.com/protocol-buffers/docs/proto#customoptions

本文来自:简书

感谢作者:癞痢头

查看原文:protoc go插件编写之三 (自定义选项)

返回前面的内容

相关阅读 >>

手撸Golang 行为型设计模式 迭代器模式

Go fileserver

Golang web框架有哪些?

Golang检查文件是否存在的方法

Golang怎么判断slice是否为空

Golang 定时器详解

Golang monGodb 的一个小坑

Golang并发模式之扇入fan-in和扇出fan-out

Go-carbon1.2.4发布了!新增系列时间比较方法

手撸Golang 结构型设计模式 代理模式

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...