【问题标题】:Reflect return values反映返回值
【发布时间】:2018-12-25 21:17:01
【问题描述】:

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

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

问题在于返回值为 nil

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

cannot convert nil to type reflect.Value

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

[<error Value>]

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

【问题讨论】:

    标签: go reflection


    【解决方案1】:

    Value.Call()调用该值所代表的函数,并返回一个slice,它表示函数的返回值(它必须是一个切片,如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
    

    【讨论】:

    • 完美,我确实注意到我可以只执行“if result[0].Interface() == nil”并消除对中间变量的需要,但我的问题解决得越少越好,谢谢。
    • @JohnDowling 是的,你当然可以这样做,我将它分成多行以显示步骤并使其更易于理解。
    猜你喜欢
    • 2020-09-03
    • 2019-10-22
    • 2019-01-05
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    相关资源
    最近更新 更多