获取golang的协议缓冲区选项信息

时间:2018-10-17 06:31:49

标签: go protocol-buffers

协议缓冲区定义如下,InvokeRequired有两个选项TestMessagemsg_option_a

msg_option_b

我想读取两个选项的定义值:

syntax = "proto3";
package grpctest;

option go_package = "pb";

import "google/protobuf/descriptor.proto";

extend google.protobuf.MessageOptions {
  int32 msg_option_a = 50011;
  int32 msg_option_b = 50012;
}

message TestMessage {
  option (msg_option_a) = 22;
  option (msg_option_b) = 33;
  string name = 1;
}

当打印整个var msg *pb.TestMessage _, md := descriptor.ForMessage(msg) options := md.GetOptions() fmt.Println(options.String()) // --> [grpcapi.msg_option_a]:22 [grpcapi.msg_option_b]:33 fmt.Println(len(options.GetUninterpretedOption())) // --> 0 时,它可以获得所有选项信息,MessageOptions返回选项定义的数组,但是长度为零。

以下是类型GetUninterpretedOption()的注释,但我无法理解其含义,并且未找到有关UninterpretedOption的任何信息:

DescriptorPool

我想获得一个特定的期权价值,但现在还没有想法。

请帮助!谢谢!

1 个答案:

答案 0 :(得分:0)

使用proto.GetExtension获取选项值:

var msg *pb.TestMessage
_, md := descriptor.ForMessage(msg)
options := md.GetOptions()

fmt.Println(options.String()) // --> [grpcapi.msg_option_a]:22 [grpcapi.msg_option_b]:33
fmt.Println(len(options.GetUninterpretedOption())) // --> 0

a, _ := proto.GetExtension(options, pb.E_MsgOptionA)
fmt.Println(*a.(*int32)) // --> 22

b, _ := proto.GetExtension(options, pb.E_MsgOptionB)
fmt.Println(*b.(*int32)) // --> 33