2016-03-11 49 views
3
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()) 
     } 
    } 
} 

這個程序的輸出是:如何判斷golang零值反映

··· 

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 == nilfalse

回答

6

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) 
} 

playground

+0

你的意思是變種V接口{} = 0;在V不是O,只有指針,以鄰? –

+0

@upduan它是'O',在這種情況下'O'是'* string',這就是爲什麼'訴(*字符串)== nil'工作。 – OneOfOne