2013-11-04 44 views
15

爲什麼Go有鍵入nil?它爲了方便引發了一個明確的接口構造檢查。什麼是無類型nil的問題,以及設計者想要通過鍵入nil解決什麼問題?Go爲什麼鍵入nil?

+1

如果Go明確使用了類似於Swift'Optional '的類型nil可能會更好。 – Eonil

+0

相關,在這裏找到一些推理和解釋:[隱藏nil值,理解爲什麼golang在這裏失敗](http://stackoverflow.com/questions/29138591/hiding-nil-values-understanding-why-golang-fails-here) – icza

回答

11

這聽起來像你問有關此錯誤消息:

http://play.golang.org/p/h80rmDYCTI

package main 

import "fmt" 

type A struct {} 
type B struct {} 

func (a *A) Foo() { 
    fmt.Println("A") 
} 

func (b *B) Foo() { 
    fmt.Println("B") 
} 

func main() { 
    n := nil 
    n.Foo() 
} 

此打印:

在這個例子中,應該程序打印 「A」 或「B」?

你必須幫助編譯器決定。你這樣做的方式是指定n的類型。

例如:

http://play.golang.org/p/zMxUFYgxpy

func main() { 
    var n *A 
    n.Foo() 
} 

打印 「A」。

在其他語言中,如果nnil或其等價物,n.Foo()可能會立即崩潰。 Go的語言設計師決定讓你確定應該發生什麼。如果您在未檢查nil的情況下訪問指針,則會獲得與其他語言相同的行爲。

+0

除非您提到的錯誤消息是「與遠程服務器通信時出錯。「(這是我得到的),你可能希望直接在你的答案中包含更多信息,而不是通過鏈接 –

+0

我要強調一點,在'nil'上調用類型化方法既有意義又有用 – Dustin

+0

@ KeithThompson好點,我已經加入了代碼,Dustin,好點,這是與問題相關的,但值得一提的是,謝謝你們兩位! – Sean

11

這是由於類型安全。 nil實際上是Go中未初始化的變量的值。切片,地圖,函數,通道,指針和接口的nil值不是相同類型,也不可比較。有關更多詳情,請參閱The language spec

編輯:正如@newacct指出了這一正確的技術術語是"zero value"的類型:

當內存分配給存儲的值,或者通過聲明或進行的呼叫或新的,並且沒有提供明確的初始化,則存儲器被給予默認初始化。這樣一個值的每個元素的類型設置爲零值:布爾值爲false,整數爲0,浮點數爲0.0,字符串爲「」,指針,函數,接口,切片,通道和地圖爲零。

Playground example

還有在Go FAQ關於零接口和錯誤的一些信息在Why is my nil error value not equal to nil?

+1

「實際上是未初始化變量的值」技術上,它被稱爲這個類型的「零值」,所有類型都有一個零值,變量不是未初始化的 – newacct

+0

@newacct我使用語言規範(http://golang.org/ref/spec)中的術語, 「未初始化片的值爲'nil'」,「未初始化指針的值爲'nil'」等等。從同一篇文檔中我可以看出,對於所有類型的「零值」是正確的我在答覆中提到的是「零」 '。我認爲「零值」的鬆散,不精確的定義是「未初始化的」,因爲Go的作者似乎很高興在實際規範中使用這兩個定義。我已經更新了我的答案,謝謝你的正確術語。 – Intermernet

相關問題