package main import ( "fmt" ) func main() { doIt := func(args int) interface{} { var result *struct{} = nil if args > 0 { result = &struct{}{} } return result } if res := doIt(-1); res != nil { fmt.Println("res != nil") } else { fmt.Println("res == nil") } }
上面的代碼輸出res != nil
git
doIt的返回類型是 interface{}
空接口, 代碼中 var result *struct{} = nil
是nil, 可是 返回的結果是interface{}
, 空接口github
對於空接口, 空接口類型能夠保存任何值,也能夠從空接口中取出原值golang
接口類型自己是沒法被值化的。在咱們賦予它實際的值以前,它的值必定會是nil,這也是它的零值。反過來說,一旦它被賦予了某個實現類型的值,它的值就再也不是nil了。後端
返回的空接口包含了指向對象result的類型信息(type)和數據指針(data)也就是說接口變量的值並不等同於這個可被稱爲動態值(result)的副本。它會包含兩個指針,一個指針指向動態值(result),一個指針指向類型信息測試