3 回答

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超6個(gè)贊
當(dāng)前最佳答案中使用的一些方法現(xiàn)已棄用,并且有點(diǎn)冗長(zhǎng)。
這是我得到它的方式:
// 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貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊
有點(diǎn)晚了,但我也遇到了同樣的情況;你可以這樣做:
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
}
}
}
}
可能有一種更直接的方法來(lái)獲取枚舉描述符,盡管經(jīng)過(guò)一番爭(zhēng)論后我還沒(méi)有成功。

TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個(gè)贊
幾個(gè)小時(shí)后,我找到了一種訪問(wèn)枚舉描述的方法。這是我的實(shí)現(xiàn),希望對(duì)您有所幫助。
在與生成的 .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
}
我確信有一種更簡(jiǎn)單的方法,但在有人找到之前,這應(yīng)該可行。
- 3 回答
- 0 關(guān)注
- 211 瀏覽
添加回答
舉報(bào)