2013-11-04 34 views
15

Go, neden yazılmıştırnil? Kolaylık için açık bir arayüz konformasyon kontrolü atar. Yazılmamış nil'un sorunu nedir ve tasarımcılar yazılan nil ile ne çözmek istiyordu?Go neden sıfır yazmış?

+1

Git, Swift 'Opsiyonel ' gibi açıkça yazılmış nil kullanmışsa daha iyi olabilir. – Eonil

+0

İlgili, bazı akıl yürütme ve açıklamaları burada bulabilirsiniz: [Nil değerlerini gizleme, golang'ın neden başarısız olduğunu anlama] (http://stackoverflow.com/questions/29138591/hiding-nil-values-understanding-why-golang-fails-here) – icza

cevap

11

Bu hata iletisi hakkında soruyorsun gibi geliyor:

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() 
} 

Bu baskılar: Bu örnekte

, gerektiği programı baskı "A" veya "B"?

Derleyicinin karar vermesine yardımcı olmalısınız. Bunu yapmanın yolu, n türünü belirtmektir. Örneğin

:

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

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

baskı "A".

Diğer dillerde, nnil veya eşdeğeri n.Foo() hemen çökebilir. Go'nun dil tasarımcıları bunun yerine ne olacağını belirlemenize izin vermeye karar verdi. İşaretçiye nil denetlemeden erişirseniz, diğer dillerde olduğu gibi davranırsınız.

+0

Gönderdiğiniz hata iletisi, "Uzak sunucuyla iletişim kurulurken hata oluştu.""(benim elimde olan şey), bir bağlantıdan ziyade cevabınıza doğrudan daha fazla bilgi eklemek isteyebilirsiniz. –

+0

" nil "üzerinde yazılan yöntemleri çağırmanın hem anlamlı hem de yararlı olduğunu vurgulayacağım. – Dustin

+0

@ KeithThompson İyi bir nokta: Ben de kodu ekledim Dustin, İyi bir nokta. Bu soruya teğet, ama kısaca bahsetmeye değer. Her ikinize de teşekkürler! – Sean

11

Bu, tür güvenliğinden kaynaklanmaktadır. nil aslında Git'teki başlatılmamış değişkeninin değeridir. Dilimler, haritalar, işlevler, kanallar, işaretçiler ve arabirimler için nil değerleri aynı türde değildir ve karşılaştırılabilir değildir. Daha fazla bilgi için The language spec'a bakın.

DÜZENLEME: @newacct tarafından işaret edildiği gibi, bu doğru teknik şart türü için "zero value" olup:

bellek beyan veya marka bir çağrı yoluyla, ya da bir değeri saklamak için ayrıldığında veya yeni ve açık başlatma sağlanmazsa, belleğe varsayılan başlatma verilir. Böyle bir değerin her bir öğesi, türü için sıfır değerine ayarlanır: booleanlar için false, tamsayılar için 0, floatlar için 0.0, dizeler için "" ve işaretçiler, işlevler, arabirimler, dilimler, kanallar ve haritalar için sıfır.

Playground example

Go FAQ yılında Why is my nil error value not equal to nil? de nil arayüzleri ve hatalar ile ilgili bazı bilgiler de bulunmaktadır

.

+1

"aslında başlatılmamış değişkenlerin değeridir" Teknik olarak adlandırılır. "Sıfır değeri" türüne göre.Tüm türler sıfır değerine sahiptir.Farklı değişkenler başlatılmamış – newacct

+0

@newacct Dil özelliğinde bulunan terminolojiyi kullanıyorum (http://golang.org/ref/spec) "Başlatılmamış bir dilimin değeri" nil "," Başlatılmamış bir işaretçinin değeri "nil" 'dir. Aynı belgeden, tüm türler için "sıfır değerinin" doğru olduğunu görebiliyorum. Cevabımdan bahsettim, hayır. '. “Yazarların sıfır değeri” nin “başlatılmamış” olmasının gevşek, kesin olmayan bir tanım olduğunu düşünüyorum. Cevabımı güncelledim, doğru terminoloji için teşekkürler. – Intermernet