反映返回值

Joh*_*ing 2 reflection go

我在调用返回值时遇到了一些问题,我有以下内容

err := reflect.ValueOf(a.a).MethodByName(gatherList[x]).Call([]reflect.Value{})
Run Code Online (Sandbox Code Playgroud)

问题在于返回值为零

我无法进行通常的错误检查,因为我得到以下信息。

cannot convert nil to type reflect.Value
Run Code Online (Sandbox Code Playgroud)

当我尝试打印 err 的内容时,我得到了;

[<error Value>]
Run Code Online (Sandbox Code Playgroud)

不确定如何继续进行此错误检查,任何帮助都会很棒。

icz*_*cza 5

Value.Call()调用由值所表示的功能,并返回一个切片表示该函数的返回值(它必须是一个切片作为转到函数和方法可以具有多个返回值)。返回的切片是 type []reflect.Value(所以它的元素是 typereflect.Value而不是interface{})。

如果您的函数或方法也返回错误,您可以检查返回切片中的相应元素。您可以使用从值中Value.Interface()获取值。interface{}reflect.Value

看这个例子:

type My int

func (m My) Get() error {
    return nil
}

func (m My) GetError() error {
    return fmt.Errorf("artificial error")
}
Run Code Online (Sandbox Code Playgroud)

调用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)
    }
}
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

No error returned by Get
Error calling GetError: artificial error
Run Code Online (Sandbox Code Playgroud)