Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 反映返回值_Go_Reflection - Fatal编程技术网

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