如何检查 reflect.Value 是否为 nil?

3

I have this code:

package main

import (
    "fmt"
    "reflect"
)


type cmd struct{
    Echo func(string) (string,error)
}



func main() {
    cmd := cmd{
        Echo : func(arg string) (string, error) {
            return arg, nil
        },
    }
    result := reflect.ValueOf(cmd).FieldByName("Echo").Call([]reflect.Value{reflect.ValueOf("test")})
    if result[1] == nil{
        fmt.Println("ok")
    }
}

我想检查我的错误是否为空,但是在我的代码中,这并不起作用,因为它有不同的类型。我试图像这样做:

reflect[1] == reflect.Value(reflect.ValueOf(nil))

所以它具有相同的类型,但reflect.Value(reflect.ValueOf(nil))的值不是nil,而是<invalid reflect.Value>


要获取存储在reflect.Value中的实际值,您可以使用.Interface()方法。https://play.golang.com/p/42fVZLqYtV3。文档:https://golang.org/pkg/reflect/#Value.Interface - undefined
1个回答

7
使用 .IsNil() 来检查存储在 reflect.Value 中的值是否为 nil
if result[1].IsNil() {
   fmt.Println("ok")
}

或者你可以使用.Interface()方法获取存储在reflect.Value中的实际值,并检查其是否为nil

if result[1].Interface() == nil {
    fmt.Println("ok")
}

1
fmt.Println(reflect.ValueOf(nil).IsNil()) 这个指令会导致一个恐慌,并显示消息 "panic: reflect: call of reflect.Value.IsNil on zero Value"。奇怪的是,方法调用 IsZero() 也会导致恐慌,并显示消息 "panic: reflect: call of reflect.Value.IsZero on zero Value"。一旦我有一个 nil 的 reflect.Value,似乎没有测试可以检测到这一点。 - undefined
你可以使用reflect.ValueOf(nil).IsValid()这个方法,根据文档的说明,如果v是零值,则返回false。 - undefined
如果 result[1].Interface() == nil,这样是行不通的。顺便说一下,如果接口是一个空指针,它只在接口的类型和接口本身都是空的情况下才有效。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接