Reflection 如何判断golang反射的零值
该程序的输出为:Reflection 如何判断golang反射的零值,reflection,go,zero,Reflection,Go,Zero,该程序的输出为: 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.CanI
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())
}
}
}
怎么了?为什么如果
v==nil
是false
?v
不是nil,它包含一个*字符串
但是,如果要检查反射值是否有效(非零),可以使用来检查
另外,如果要检查它是否为nil,可以检查如果val.Kind()==reflect.Ptr&&val.IsNil(){}
一个小演示:
···
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
···
你的意思是var v接口{}=o;v不是o,只是指向o的指针?@upduan它是o
,在这种情况下o
是*字符串
,这就是v.(*字符串)=nil
起作用的原因。
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)
}