我在通话时遇到一些问题,我有以下
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
不确定如何继续进行此错误检查,任何帮助都会很棒。
答案 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