我在调用返回值时遇到了一些问题,我有以下内容
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)
不确定如何继续进行此错误检查,任何帮助都会很棒。
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)
| 归档时间: |
|
| 查看次数: |
3963 次 |
| 最近记录: |