我在调用返回值时遇到了一些问题,我有以下
err := reflect.ValueOf(a.a).MethodByName(gatherList[x]).Call([]reflect.Value{})
问题是返回值是nil
我不能做通常的错误检查,因为我得到以下内容:
cannot convert nil to type reflect.Value
当我试图打印err的内容时,我得到;
[<error Value>]
不太确定如何继续进行这个错误检查,任何帮助将是伟大的。
Value.Call()
调用由该值表示的函数,并返回一个切片,该切片表示该函数的返回值(它必须是一个切片,因为Go中的函数和方法可能有多个返回值)。返回的切片类型为[]reflect.Value
(因此它的元素类型为reflect.Value
而不是interface{}
)。
如果函数或方法也返回错误,则可以在返回的切片中检查相应的元素。您可以使用Value.Interface()
从reflect.Value
的值中获得interface{}
的值。
请看下面的例子:
type My int
func (m My) Get() error {
return nil
}
func (m My) GetError() error {
return fmt.Errorf("artificial error")
}
调用My.Get()
永远不会返回错误(它返回nil
),调用My.GetError()
总是返回非nil
错误。
用反射调用它们:
methods := []string{"Get", "GetError"}
for _, m := range methods {
result := reflect.ValueOf(My(0)).MethodByName(m).Call(nil)
err := result[0].Interface()
if err == nil {
fmt.Println("No error returned by", m)
} else {
fmt.Printf("Error calling %s: %v", m, err)
}
}
输出(在Go Playground上试试):
No error returned by Get
Error calling GetError: artificial error