如何访问 proto.EnumValueOptions 扩展值

我有类似下面的设置,如何XYZ使用“github.com/golang/protobuf/proto”从枚举访问我的扩展值?


  extend google.protobuf.EnumValueOptions {

    Details meta = 50001;

  }


  message Details {

    string description = 1;

  }


  enum MyEnum {

    MY_ENUM_UNSPECIFIED = 0;

    XYZ = 1 [deprecated=true, (meta) = {description: "lorem ipsum"}];

  }

我知道proto.GetExtension(proto.Message, proto.ExtensionDesc),但是我无法弄清楚如何将它用于枚举...


aluckdog
浏览 163回答 3
3回答

慕码人8056858

当前最佳答案中使用的一些方法现已弃用,并且有点冗长。这是我得到它的方式:// pd is the module of your complied protobuf filesfd := pd.File_name_of_your_proto_file_protoenumDesc := fd.Enums().ByName("MyEnum")if enumDesc == nil {    panic()}enumValDesc := enumDesc.Values().ByName("XYZ")if enumValDesc == nil {    panic()}ext := proto.GetExtension(enumValDesc.Options(), pd.E_Meta)if enumValDesc == nil {    panic()}meta := ext.(*Details)让我知道是否有更好的方法。

慕哥9229398

有点晚了,但我也遇到了同样的情况;你可以这样做:fd, _ := descriptor.ForMessage(&pb.Details{})for _, e := range fd.EnumType {    if e.GetName() == "MyEnum" {        for _, v := range e.Value {            ext, err := proto.GetExtension(v.Options, pb.E_Meta)            if err == nil {                details := ext.(*pb.Details)                // do stuff with details            }        }    }}可能有一种更直接的方法来获取枚举描述符,尽管经过一番争论后我还没有成功。

手掌心

几个小时后,我找到了一种访问枚举描述的方法。这是我的实现,希望对您有所帮助。在与生成的 .pb 文件位于同一包中的名为 enum.go 的文件中,我将此方法添加到检索描述的枚举类型。func (t MyEnum) GetValue() (*Details, error) {    tt, err := proto.GetExtension(proto.MessageV1(t.Descriptor().Values().ByNumber(t.Number()).Options()), E_Details)    if err != nil {        return nil, err    }    return tt.(*Details), nil}我确信有一种更简单的方法,但在有人找到之前,这应该可行。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go