为了账号安全,请及时绑定邮箱和手机立即绑定

golang反射的零值如何判断

golang反射的零值如何判断

Go
catspeake 2021-12-20 16:43:13
package mainimport (    "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 Valuegoroutine 1 [running]:panic(0xd65a0, 0xc82005e000)    /usr/local/go/src/runtime/panic.go:464 +0x3e6reflect.Value.CanInterface(0x0, 0x0, 0x0, 0x0)    /usr/local/go/src/reflect/value.go:897 +0x62···怎么了?为什么v == nil是false?
查看完整描述

1 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

v不是零,它包含一个*string.


但是,如果要检查反射值是否有效(非零),则可以使用val.IsValid()来检查。


另外,如果你想检查它是否为零,你可以检查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)

}


查看完整回答
反对 回复 2021-12-20
  • 1 回答
  • 0 关注
  • 280 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号