爲什麼Go有鍵入nil
?它爲了方便引發了一個明確的接口構造檢查。什麼是無類型nil
的問題,以及設計者想要通過鍵入nil
解決什麼問題?Go爲什麼鍵入nil?
回答
這聽起來像你問有關此錯誤消息:
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」。
在其他語言中,如果n
是nil
或其等價物,n.Foo()
可能會立即崩潰。 Go的語言設計師決定讓你確定應該發生什麼。如果您在未檢查nil
的情況下訪問指針,則會獲得與其他語言相同的行爲。
這是由於類型安全。 nil
實際上是Go中未初始化的變量的值。切片,地圖,函數,通道,指針和接口的nil
值不是相同類型,也不可比較。有關更多詳情,請參閱The language spec。
編輯:正如@newacct指出了這一正確的技術術語是"zero value"的類型:
當內存分配給存儲的值,或者通過聲明或進行的呼叫或新的,並且沒有提供明確的初始化,則存儲器被給予默認初始化。這樣一個值的每個元素的類型設置爲零值:布爾值爲false,整數爲0,浮點數爲0.0,字符串爲「」,指針,函數,接口,切片,通道和地圖爲零。
還有在Go FAQ關於零接口和錯誤的一些信息在Why is my nil error value not equal to nil?。
「實際上是未初始化變量的值」技術上,它被稱爲這個類型的「零值」,所有類型都有一個零值,變量不是未初始化的 – newacct
@newacct我使用語言規範(http://golang.org/ref/spec)中的術語, 「未初始化片的值爲'nil'」,「未初始化指針的值爲'nil'」等等。從同一篇文檔中我可以看出,對於所有類型的「零值」是正確的我在答覆中提到的是「零」 '。我認爲「零值」的鬆散,不精確的定義是「未初始化的」,因爲Go的作者似乎很高興在實際規範中使用這兩個定義。我已經更新了我的答案,謝謝你的正確術語。 – Intermernet
- 1. 爲什麼self.splitViewController == nil?
- 2. 爲什麼myInstance = nil而不是self.myInstance = nil?
- 3. 爲什麼(=(vector nil)(vec nil))返回false?
- 4. 爲什麼Nil :: Nil會返回List(List())?
- 5. 爲什麼NSDateFormatter返回nil?
- 6. 爲什麼attr_accessor:type返回nil?
- 7. 爲什麼NSDateFormatter返回nil?
- 8. 爲什麼model.read_attribute返回nil?
- 9. 爲什麼plant1保持NIL?
- 10. 爲什麼fetchedResultsController設置爲nil?
- 11. 爲什麼OS X定義爲'nil'
- 12. iPhone SDK:請解釋爲什麼「nil ==」與「== nil」不同
- 13. 爲什麼在消息nil無效時檢查self!= nil in -init?
- 14. 爲什麼.where(:attribute => nil)檢查nil值?
- 15. 爲什麼Ruby中的a = a`` nil`?
- 16. 爲什麼Lua解釋器輸出nil?
- 17. 爲什麼我不能做self.strID = nil;?
- 18. 爲什麼沒有(cell == nil)工作?
- 19. 爲什麼我的NSDateFormatter返回nil?
- 20. 爲什麼NSApplication sharedApplication mainMenu返回nil?
- 21. 爲什麼NSHTTPURLResponse返回nil? NSURLSession,Swift 2.2
- 22. 爲什麼Apache CXF不尊重'nil =「true」'
- 23. 爲什麼NSDateFormatter的dateFromString返回nil?
- 24. 爲什麼定義的?(ModelName)返回nil?
- 25. 爲什麼UItableViewCell viewWithTag返回nil?
- 26. 在Ruby中,爲什麼!nil return => true?
- 27. 爲什麼@ user.update_attributes(nil)返回true?
- 28. 全局鍵盤輸入Go
- 29. Go用於什麼?
- 30. `(* RawMessage)(nil)`是什麼意思?
如果Go明確使用了類似於Swift'Optional'的類型nil可能會更好。 –
Eonil
相關,在這裏找到一些推理和解釋:[隱藏nil值,理解爲什麼golang在這裏失敗](http://stackoverflow.com/questions/29138591/hiding-nil-values-understanding-why-golang-fails-here) – icza