ProgramlamaGo geliştirici

Go'da Gölgeleme (değişkenlerin gölgelenmesi) nasıl çalışır? Bu dilin bu özelliği, programlama sırasında zor tespit edilebilen hatalara nasıl yol açabilir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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.

Kandırmaca Soru

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:

  • İçeride if içinde yeni x ve y değişkenleri tanımlanacak, sadece if bloğunda erişilebilir olacaklar.
  • Bloğun dışında x değişkeni hala dışarıdaki değişkendir, değeri değişmeyecek.

Sonuç:

1 2
7

Bilinmeyen İnceliklerden Kaynaklanan Gerçek Hata Örnekleri


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ü.