Go 如何访问proto.EnumValueOptions扩展值

Go 如何访问proto.EnumValueOptions扩展值,go,protocol-buffers,Go,Protocol Buffers,我有如下类似的设置,如何使用“github.com/golang/protobuf/proto”从XYZenum访问扩展值 我知道proto.GetExtension(proto.Message,proto.ExtensionDesc),但是我不知道如何将它用于枚举…有点晚了,但我刚刚遇到了同样的问题;您可以这样做: fd, _ := descriptor.ForMessage(&pb.Details{}) for _, e := range fd.EnumType { if e

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


我知道
proto.GetExtension(proto.Message,proto.ExtensionDesc)
,但是我不知道如何将它用于枚举…

有点晚了,但我刚刚遇到了同样的问题;您可以这样做:

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
}
我相信有一个更简单的方法,但在有人找到之前,这应该是可行的

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
}