如何判断golang反射中的零值

7
package main

import (
    "fmt"
    "reflect"
)

func main() {
    var p1 *string = nil
    var v interface{} = p1
    val := reflect.Indirect(reflect.ValueOf(v))
    if v == nil {
        fmt.Printf("NULL")
    } else {
        if val.CanInterface() {
            fmt.Printf("if is %v\n", val.Interface())
        }
    }
}

该程序的输出为:
···

panic: reflect: call of reflect.Value.CanInterface on zero Value

goroutine 1 [running]:
panic(0xd65a0, 0xc82005e000)
    /usr/local/go/src/runtime/panic.go:464 +0x3e6
reflect.Value.CanInterface(0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/reflect/value.go:897 +0x62

···

有什么问题吗?为什么v == nil的结果是false

1个回答

16

v 不是 nil,它包含一个 *string

然而,如果您想检查反射值是否有效(非零),可以使用val.IsValid() 进行检查。

另外,如果您想检查它是否为 nil,可以检查 if val.Kind() == reflect.Ptr && val.IsNil() {}

一个小示例:

func main() {
    var p1 *string = nil
    var v interface{} = p1
    // this will return an invalid value because it will return the Elem of a nil pointer.
    //val := reflect.Indirect(reflect.ValueOf(v))
    val := reflect.ValueOf(v) // comment this to see the difference.
    if !val.IsValid() {
        fmt.Printf("NULL")
    } else {
        if val.CanInterface() {
            fmt.Printf("if is %#+v (%v)\n", val.Interface(), val.Interface() == nil)
        }
    }
    fmt.Println(v.(*string) == nil)
}

playground


你的意思是 var v interface{} = o; 中的 v 不是 o,只是指向 o 的指针吗? - up duan
@upduan,这里的“o”是一个*string,所以v.(*string) == nil才能起作用。 - OneOfOne

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