Gölgeleme (shadowing) — bir değişkenin iç alanında, dış alandaki aynı isimli değişkeni gizlemesi ("gölgelemesi"). Go'da bu, değişken tanım bloku := özellikle bloklar (örneğin, if, for, switch vb.) içinde olmasından dolayı mümkündür.
x := 5 if true { x := 10 // Bu x — yeni bir değişken, sadece bu if'de geçerli fmt.Println(x) // 10 } fmt.Println(x) // 5, 10 değil
Bazen bu yararlı olabilir, ancak unutulduğunda yeniden tanımlanan değişkenin dışarıdaki değişkenle aynı olmadığını göz ardı etmek sık sık hatalara yol açabilir.
Soru: "Aşağıdaki kod neyi yazdırır?"
x := 7 if true { x, y := 1, 2 fmt.Println(x, y) } fmt.Println(x)
Cevap:
if içinde yeni x ve y değişkenleri tanımlanacak, sadece if bloğunda erişilebilir olacaklar.x değişkeni hala dışarıdaki değişkendir, değeri değişmeyecek.Sonuç:
1 2
7
Hikaye
Gölgeleme ile kaynak sızıntısı: Dosya işlemleri sırasında hata değişkeninin gölgelenmesi tipik bir hata.
f, err := os.Open("file.txt") if err != nil { return err } if err := f.Close(); err != nil { return err } // bu yeni bir err değişkeni!
Operatör := yalnızca blok içinde yeni bir err değişkeni oluşturur, dışarıdaki err değişkeni değişmez. Hataların dış değişkenle işlenmesi bekleniyorsa, hata bilgisi kaybolur.
Hikaye
Gölgeleme ile yapılar — görünmez hatalar: İç içe bir blokta geliştirici aynı isimli bir yapıyı yeniden tanımladı. Bunun sonucu olarak, bir kısım mantık iç versiyonla, diğer bir kısım ise dış versiyonla çalıştı, bu da garip hatalara ve faturalama hizmetinde veri kaybına yol açtı.
Hikaye
Döngülerde gölgelenme hesaplamaları bozuyor:
Bir yıllık talep işleme sisteminde döngüde sayaç artırmak için := yerine = kullanıldı, bu nedenle döngü içinde yeni bir değişken oluşturuldu ve artırıldı, dışardaki sayaç değişmedi. Sistem talepleri eksik saydı ve önemli istatistikleri düşürdü.