2016-12-02 86 views
-2

我有這個小golang測試我不明白:類型聲明的重要性,零值

package main 

import "fmt" 

type myObj struct { 
} 

func nilObj() *myObj { 
    return nil 
} 

func nilInt() interface{} { 
    return nil 
} 

func main() { 
    var obj1 interface{} 
    fmt.Println(obj1 == nil) // true 
    obj1 = nilObj() 
    fmt.Println(obj1 == nil) // false 

    var obj2 *myObj 
    fmt.Println(obj2 == nil) // true 
    obj2 = nilObj() 
    fmt.Println(obj2 == nil) // true 

    var obj3 interface{} 
    fmt.Println(obj3 == nil) // true 
    obj3 = nilInt() 
    fmt.Println(obj3 == nil) // true 
} 

OBJ1和OBJ2之間,只有變量聲明的變化,但其結果是不同的。

在obj1和obj3之間,函數調用不會返回相同的類型(結構指針vs接口)。我不完全確定我理解結果。

任何幫助是歡迎(https://play.golang.org/p/JcjsJ-_S8I

回答

1

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

僅當內部值和類型都未設置時,接口值爲nil(nil, nil)。特別是,一個nil接口將始終保持nil類型。如果我們在接口值內存儲了nil類型*int指針,則無論指針的值如何,內部類型都將爲*int(*int, nil)。因此,即使內部指針是nil,這樣的接口值也將不是nil

https://golang.org/doc/faq#nil_error

+0

無法再找到這樣的解釋。感謝您的提醒! – Redtakfeoh