получить информацию о параметрах буфера протокола для golang - PullRequest
0 голосов
/ 17 октября 2018

Определение буфера протокола следующее: TestMessage имеет две опции msg_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:

// A message representing a option the parser does not recognize. This only
// appears in options protos created by the compiler::Parser class.
// DescriptorPool resolves these when building Descriptor objects. Therefore,
// options protos in descriptor objects (e.g. returned by Descriptor::options(),
// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
// in them.

Iхочу получить конкретное значение опции ,, но без идей сейчас.

Пожалуйста, помогите!Спасибо!

1 Ответ

0 голосов
/ 17 октября 2018

использовать 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
...