Go 如何在reflect.Call return中访问自定义类型?
我知道在Go中编写泛型函数并不惯用,但在深入研究Go 如何在reflect.Call return中访问自定义类型?,go,reflection,Go,Reflection,我知道在Go中编写泛型函数并不惯用,但在深入研究Go generate之前,我想探索一下我的选项 我遇到的问题是,Value.Call()返回一个片段,其中我感兴趣的元素是指向自定义结构的指针。好像我找不到一个方法来访问这个 返回:=listMethod.Call([]reflect.Value{reflect.ValueOf(filter)}) fmt.Println(退货) 输出 [<vspk.EnterpriseProfilesList Value> <*bambou.
Go generate
之前,我想探索一下我的选项
我遇到的问题是,Value.Call()
返回一个片段,其中我感兴趣的元素是指向自定义结构的指针。好像我找不到一个方法来访问这个
返回:=listMethod.Call([]reflect.Value{reflect.ValueOf(filter)})
fmt.Println(退货)
输出
[<vspk.EnterpriseProfilesList Value> <*bambou.Error Value>]
我想访问vspk.enterpriseeprofileslist
,但我很难做到这一点
如果我尝试像这样检索基础值:
returns := listMethod.Call([]reflect.Value{reflect.ValueOf(filter)})
ret1 := returns[0].Interface()
fmt.Println(ret1)
我收到
[0xc0000fc7e0]
返回类型为[]的值reflect.value
。您感兴趣的是该切片的第一个值:返回[0]
这当然是一种类型。要提取包装在其中的值,请使用
这将是接口{}
类型。如果需要混凝土类型,请使用:
例如:
if list, ok := returns[0].Interface().(spk.EnterpriseProfilesList); ok {
// here list is of type spk.EnterpriseProfilesList
} else {
// it was nil or not of type spk.EnterpriseProfilesList
}
谢谢@icza,我能以某种方式使类型断言动态吗?i、 e.如果我只有一个字符串“EnterpriseProfileList”,我可以在类型断言语句中使用它吗?@RomanDodin No,Go是一种静态类型语言。看见和。
returns[0].Interface().(spk.EnterpriseProfilesList)
if list, ok := returns[0].Interface().(spk.EnterpriseProfilesList); ok {
// here list is of type spk.EnterpriseProfilesList
} else {
// it was nil or not of type spk.EnterpriseProfilesList
}