Go'da, açık bir başlatıcı olmadan tanımlanan değişkenler, farklı türler için değişen belirli sıfır değerleri (zero values) alır:
int — 0bool — falsestring — ""Bu kullanışlıdır (bellekte çöp yok), ancak tehlikeli olabilir: bazı türler, örneğin, dilimler ve haritalar için nil değeriyle çalışmak panik veya hatalara yol açabilir.
Örnek:
var m map[string]int m["key"] = 1 // panic: nil haritadaki bir girişe atama var s []int fmt.Println(s, s == nil) // [] true (eleman eklenebilir, ancak indiste erişilemez)
nil değerinin dilim ile harita/kanal arasındaki farkı nedir ve bunlar hangi hatalara yol açar?
Doğru cevap: nil değeri olan bir dilimi fonksiyonlara geçirebilir, append ve range'de kullanabilirsin — bu güvenlidir, ancak nil haritası ile yazma denemesi panik yaratır (ancak okuma güvenlidir ve sıfır değerini getirir).
Örnek:
var m map[string]int fmt.Println(m["no_key"]) // 0 — güvenli m["key"] = 1 // panic! var s []int s = append(s, 42) // tamam
Hikaye
Açıklama: Büyük bir projede veri toplamak için başlatılmamış haritalar kullanıldı. İlk yazmada uygulama sürekli olarak panik yapıyordu. Sorun, yeni istatistikler eklendiğinde üretim ortamında ortaya çıktı.
Hikaye
Açıklama: Hizmet, başlatılmamış bir dilimi JSON olarak API cevabı olarak gönderdi.
[]yerine istemcilernullaldı — her iki durumu işlemek için ön uçta şemayı değiştirmek zorunda kaldık.
Hikaye
Açıklama: Önbellek modülünde nil harita ile boş bir haritayı yanlışlıkla karşılaştırdık ve bu nedenle, öğelerin olup olmadığını yanlış belirledik. Bu, veritabanına gereksiz erişimlere ve performans düşüşüne yol açtı.