如何在reflect.Call返回中访问自定义类型?

时间:2019-06-14 07:54:04

标签: go reflection

我知道在Go语言中编写通用函数并不是惯用的方法,但是我想在进入go generate之前先探讨一下自己的选择。

我遇到的问题是Value.Call()返回一个切片,其中我感兴趣的元素是指向自定义结构的指针。好像我找不到方法来访问它。

returns := listMethod.Call([]reflect.Value{reflect.ValueOf(filter)})
fmt.Println(returns)

输出

[<vspk.EnterpriseProfilesList Value> <*bambou.Error Value>]

类型定义:

type EnterpriseProfilesList []*EnterpriseProfile

我想访问vspk.EnterpriseProfilesList,但我正在努力做到这一点。

如果我尝试像这样检索基础值:

returns := listMethod.Call([]reflect.Value{reflect.ValueOf(filter)})
ret1 := returns[0].Interface()
fmt.Println(ret1)

我收到

[0xc0000fc7e0]

1 个答案:

答案 0 :(得分:2)

Value.Call()返回类型为[]reflect.Value的值。您感兴趣的是该切片的第一个值:returns[0]

这当然是reflect.Value类型。要提取包装在其中的值,请使用Value.Interface()

这将是类型interface{}。如果需要具体类型,请使用type assertion

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
}