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


本文摘自网络,作者,侵删。

选项 [options]

.proto文件中的各个声明【message呀,service呀等等】可以使用许多选项进行注释。选项不会改变声明的整体含义,但可能会影响在特定上下文中处理声明的方式。

可用选项的完整列表在google/protobuf/descriptor.proto中定义。

一些选项是文件级别的, 只能在顶级内容区, 而不能在任何 message, 或enum,或service中定义。一些是消息级别的, 只能定义在message内, 一些是字段级别的,只能定义在filed内。选项也可以写在枚举类型,枚举值,字段,服务类型和服务方法中;但是,目前尚无任何针对这些选项的有用选项。

  • file level options

    • 例1: go_package 想要的golang中使用的包名
    options go_package = github.com/kekek/test; 
    
    • 例2: optimize_for, 可以设置为 SPEED, CODE_SIZE, 或 LITE_RUNTIME, 只对C++ 或者java起作用
    option optimize_for = CODE_SIZE;
    
  • message level options

    例1:message_set_wire_format, 如果设置为true,则消息使用另一种二进制格式,旨在与Google内部使用的旧格式MessageSet兼容。 Google外部的用户可能永远不需要使用此选项。

    message Foo {
        option message_set_wire_format = true;
        extensions 4 to max;
    }
    
    
  • filed options

    例1: packed, 如果在基本数字类型的重复字段上设置为true,则使用更紧凑的编码。使用此选项没有任何弊端。但是,请注意,在版本2.3.0之前,解析器在不期望收到打包数据时将忽略该数据。因此,不可能在不破坏电线兼容性的情况下将现有字段更改为打包格式。在2.3.0及更高版本中,此更改是安全的,因为可打包字段的解析器将始终接受两种格式,但是如果必须使用旧的protobuf版本处理旧程序,请务必小心。

    repeated int32 samples = 4 [packed=true];
    

    例2: deprecated, 如果设置为true,则表明该字段已弃用,并且不应由新代码使用。在大多数语言中,这没有实际效果。在Java中,这成为@Deprecated批注。

    optional int32 old_field = 6 [deprecated=true];
    

自定义选项 [Custom Options]

Protocol Buffers 允许自定义选项,这是大多数人用不到的功能, 且自定义选项仅支持proto3。

由于"选项" 是由 google/protobuf/descriptor.proto中定义的消息定义的(例如FileOptions或FieldOptions),因此自定义选项仅是扩展这些消息而已。

例如:

import "google/protobuf/descriptor.proto";

extend google.protobuf.MessageOptions {
  optional string my_option = 51234;
}

message MyMessage {
  option (my_option) = "Hello world!";
}

在这里,我们通过扩展MessageOptions定义了一个新的消息级选项。当我们使用选项时,选项名称必须用括号括起来以表明它是扩展名。我们现在可以像这样在C++中读取my_option的值:


string value = MyMessage::descriptor()->options().GetExtension(my_option);

在这里,MyMessage :: descriptor()-> options()返回MyMessage的MessageOptions协议消息。从中读取自定义选项就像读取任何其他扩展名一样。

阅读剩余部分

相关阅读 >>

[系列] Go - 结构(struct) 实现 接口(interface)

解析Go中的多态 -无需interfaces

Golang defer什么时候执行

Golang二维切片初始化

Golang判断是否存在不存在就创建文件

Golang make和new区别

基本操作:Go创建graphql api

Go 函数选项模式

Go语言开发工具

关于面试

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




打赏

取消

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

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

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

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

评论

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