3 回答

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)
讓我知道是否有更好的方法。

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
}
}
}
}
可能有一種更直接的方法來獲取枚舉描述符,盡管經過一番爭論后我還沒有成功。

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
}
我確信有一種更簡單的方法,但在有人找到之前,這應該可行。
- 3 回答
- 0 關注
- 200 瀏覽
添加回答
舉報