反映返回值



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

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

相关内容

  • 没有找到相关文章

最新更新