2017-03-28 20 views
4

代碼段如下:golang(* interface {})(nil)是否爲零?

package main 

import (
    "fmt" 
    "reflect" 
) 

func main() { 
    a := (*interface{})(nil) 
    fmt.Println(reflect.TypeOf(a), reflect.ValueOf(a)) 
    var b interface{} = (*interface{})(nil) 
    fmt.Println(reflect.TypeOf(b), reflect.ValueOf(b)) 
    fmt.Println(a == nil, b == nil) 
} 

輸出象下面這樣: *interface {} <nil> *interface {} <nil> true false 所以var interface{}是從:=不同,爲什麼呢?

回答

7

根據golang faq

在內部,接口被實現爲兩個元件,一個類型和一個值。該值稱爲接口的動態值,是一個任意的具體值,類型是值的類型。對於int值3,接口值示意性地包含(int,3)。

接口值是nil只有如果內值和類型都沒有設置,(零,無)。特別是,一個nil接口將始終保持爲零類型。如果我們在接口值中存儲一個類型爲* int的零指針,則無論指針的值是什麼,內部類型都將是* int:(* int,nil)。因此,即使內部指針爲零,這樣的接口值也不會爲零。

a := (*interface{})(nil)等於var a *interface{} = nil

var b interface{} = (*interface{})(nil),平均b是類型interface{},並interface{}變量時,它只是nil型和價值都nil,顯然鍵入*interface{}nil

+0

不錯的答案,不知道這個。我不得不說,我很難理解你的解釋......你可以從你的鏈接引用前兩段,它會增加你的答案的價值!編輯 – alexbt

+0

,感謝@alexbt – zzn

相關問題