为了账号安全,请及时绑定邮箱和手机立即绑定

如何访问 proto.EnumValueOptions 扩展值

如何访问 proto.EnumValueOptions 扩展值

Go
aluckdog 2023-05-22 15:52:48
我有类似下面的设置,如何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),但是我无法弄清楚如何将它用于枚举...
查看完整描述

3 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

当前最佳答案中使用的一些方法现已弃用,并且有点冗长。


这是我得到它的方式:


// pd is the module of your complied protobuf files

fd := pd.File_name_of_your_proto_file_proto

enumDesc := 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)

让我知道是否有更好的方法。


查看完整回答
反对 回复 2023-05-22
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

有点晚了,但我也遇到了同样的情况;你可以这样做:


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

            }

        }

    }

}

可能有一种更直接的方法来获取枚举描述符,尽管经过一番争论后我还没有成功。


查看完整回答
反对 回复 2023-05-22
?
手掌心

TA贡献1942条经验 获得超3个赞

几个小时后,我找到了一种访问枚举描述的方法。这是我的实现,希望对您有所帮助。


在与生成的 .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

}

我确信有一种更简单的方法,但在有人找到之前,这应该可行。


查看完整回答
反对 回复 2023-05-22
  • 3 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信