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ış?
cevap
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, n
nil
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.
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. –
" nil "üzerinde yazılan yöntemleri çağırmanın hem anlamlı hem de yararlı olduğunu vurgulayacağım. – Dustin
@ 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
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.
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
."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
@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
- 1. Rails.root neden sıfır?
- 2. Neden java.lang.ArithmeticException alıyorum:/sıfır?
- 3. Go
- 4. Ruby'de neden "sıfır ise" yapamıyorum?
- 5. GO
- 6. Go
- 7. Go
- 8. GO
- 9. Go
- 10. Neden glGetString (GL_VERSION) OpenGL sürümü yerine sıfır/sıfır döndürür?
- 11. Dizideki ilk anahtar olarak neden sıfır ayarlayamıyorum?
- 12. Neden double.Parse sıfır işareti yok sayıyor? Örneğin
- 13. Sıfır sonlandırıcı neden bir dizgede rastgele yerleştirilemiyor?
- 14. Go atomic.AddFloat32()
- 15. Sıfır ortalama sıfır olmayan değerler
- 16. Kullanım AlamofireObjectMapper ben bu kodu yazmış olması dönmek fonk
- 17. Go, neden kapalı bir kanala yazı yazarken panik yapıyor?
- 18. Neden sql etiketlerini gorm gibi bazı go libs yapılarında kullanıyorsunuz?
- 19. Java'da sıfır sıfır (0) 'nın anlamı nedir?
- 20. AdMob Yanıt iletisi sıfır veya sıfır uzunluk
- 21. Call Go işlevleri C
- 22. Desteklenmeyen URL protolu GO
- 23. Go BaşlıyorWith (str string)
- 24. Android Studio ve Go?
- 25. Eclipse'de Go testlerini çalıştırma
- 26. Bir Dinleme sunucusunu Go
- 27. Go, Google App Engine
- 28. Dilim dizinini Go
- 29. go-sql-driver
- 30. sıfır montaj
Git, Swift 'Opsiyonel' gibi açıkça yazılmış nil kullanmışsa daha iyi olabilir. –
Eonil
İ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