反思 – 如何判断golang反射的零值
发布时间:2020-12-16 09:28:11 所属栏目:大数据 来源:网络整理
导读: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 %vn",val.Interf
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 %vn",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)
/usr/local/go/src/reflect/value.go:897 +0x62
···
怎么回事?为什么v == nil是假的? 解决方法
v不是nil,它包含*字符串.
但是,如果要检查反射值是否有效(非零),可以使用 此外,如果你想检查它是否为零,你可以检查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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
