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) /usr/local/go/src/reflect/value.go:897 +0x62 ···
怎么回事?为什么v == nil是假的?
解决方法
v不是nil,它包含*字符串.val.IsValid()
此外,如果你想检查它是否为零,你可以检查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) }