反映回报值

时间:2016-09-28 15:16:46

标签: go reflection

我在通话时遇到一些问题,我有以下

git ls-remote --tags <remote_name>

问题在于返回值为nil

我得到以下内容时无法进行常规错误检查。

err := reflect.ValueOf(a.a).MethodByName(gatherList[x]).Call([]reflect.Value{})

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

cannot convert nil to type reflect.Value

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

1 个答案:

答案 0 :(得分:3)

Value.Call()调用由值表示的函数,并返回一个 slice ,它表示函数的返回值(它必须是一个切片,如Go函数和方法可能有多个返回值)。返回的切片的类型为[]reflect.Value(因此其元素的类型为reflect.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")
}

调用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