Go 反映返回值
我在通话中遇到了一些关于返回值的问题,我有以下几点Go 反映返回值,go,reflection,Go,Reflection,我在通话中遇到了一些关于返回值的问题,我有以下几点 err := reflect.ValueOf(a.a).MethodByName(gatherList[x]).Call([]reflect.Value{}) 问题在于返回值为零 我不能做通常的错误检查,因为我得到以下信息 cannot convert nil to type reflect.Value 当我试图打印我得到的err的内容时 [<error Value>] [] 我真的不知道如何进行这个错误检查,任何帮助都会很
err := reflect.ValueOf(a.a).MethodByName(gatherList[x]).Call([]reflect.Value{})
问题在于返回值为零
我不能做通常的错误检查,因为我得到以下信息
cannot convert nil to type reflect.Value
当我试图打印我得到的err的内容时
[<error Value>]
[]
我真的不知道如何进行这个错误检查,任何帮助都会很好 调用由值表示的函数,并返回一个表示函数返回值的切片(它必须是切片,因为Go函数和方法可能有多个返回值)。返回的片的类型为[]reflect.Value
(因此其元素的类型为reflect.Value
,而不是接口{}
)
如果函数或方法也返回错误,则可以检查返回片段中的相应元素。您可以使用从reflect.value
值中获取值作为接口{}
请参见此示例:
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)
}
}
输出(在上尝试):
很好,我确实注意到我可以只执行“if result[0].Interface()==nil”并消除使用中介变量的需要,但还是解决了我的问题,谢谢。@JohnDowling是的,当然你可以这样做,我将其拆分为多行以显示步骤并使其更易于理解。
No error returned by Get
Error calling GetError: artificial error