gpt4 book ai didi

go - 反射(reflect)返回值

转载 作者:IT王子 更新时间:2023-10-29 01:38:59 26 4
gpt4 key购买 nike

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

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

问题在于返回值为 nil

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

cannot convert nil to type reflect.Value

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

[<error Value>]

不太确定如何继续进行此错误检查,任何帮助都将非常有用。

最佳答案

Value.Call()调用由值表示的函数,并返回一个 slice 表示函数的返回值(它必须是一个 slice ,因为在 Go 函数和方法中可能有多个返回值)。返回的 slice 是 []reflect.Value 类型(因此它的元素是 reflect.Value 而不是 interface{} 类型)。

如果您的函数或方法也返回错误,您可以检查返回的 slice 中的相应元素。您可以使用 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

关于go - 反射(reflect)返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39751508/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com