1 puan yazan GN⁺ 2023-09-20 | 1 yorum | WhatsApp'ta paylaş
  • Yaklaşan Go 1.22 sürümü, birçok şirkette üretim sorunlarına yol açan for döngüsü kapsamıyla ilgili yaygın bir hatayı düzeltmeyi planlıyor.
  • Sorun, yineleme sona erdikten sonra döngü değişkenine olan bir referansın korunması ve bunun sonucunda değişkenin istenmeyen yeni bir değer almasıyla ortaya çıkıyor.
  • Bu sorun hem eşzamanlı hem de eşzamanlı olmayan Go kodlarında yaygındır; referansın değişkenin ömrünü yinelemenin ötesine taşıyıp taşımadığını analiz etmenin karmaşıklığı nedeniyle tespit edilmesi ve düzeltilmesi zordur.
  • Bu tür hataları tespit eden mevcut araçlar sık sık yanlış negatif veya yanlış pozitif sonuçlar üretir; bu da gereksiz kod değişikliklerine ya da gözden kaçan sorunlara yol açar.
  • Go 1.22'de önerilen düzeltme, for döngülerinin yineleme kapsamı yerine döngü kapsamına sahip olacak şekilde değiştirilmesidir; böylece bu tür hatalar ve isabetsiz araçlara duyulan ihtiyaç ortadan kalkacaktır.
  • Geriye dönük uyumluluğu korumak için yeni anlambilim yalnızca go.mod dosyasında Go 1.22 veya üzerini bildiren modüllerdeki paketlere uygulanacaktır.
  • Geliştiriciler, belirli paketlerde anlambilimin ne zaman değişeceğini kontrol edebilecek ve mevcut kod şu an olduğu gibi çalışmaya devam edecektir.
  • Go 1.21, ortamda GOEXPERIMENT=loopvar ayarlanarak etkinleştirilebilen bu kapsam değişikliğinin bir önizlemesini içerir.
  • Bu değişiklik Google içinde kapsamlı biçimde test edildi ve üretim kodunda bildirilen bir sorun olmadı.
  • Ancak, döngü değişkeni sorunu nedeniyle aslında test etmek istedikleri şeyi test edemeyen bazı testlerin düzeltilmesi gerekti.
  • Go 1.21'in loopclosure analizcisi, bu tür sorunları tespit edip raporlamada iyileştirildi; böylece geliştiricilerin Go 1.22'deki değişikliğe hazırlanmasına yardımcı oluyor.
  • Bu değişiklik hakkında daha fazla bilgi tasarım belgesinde ve SSS'de bulunabilir.

1 yorum

 
GN⁺ 2023-09-20
Hacker News görüşü
  • Go 1.22 içindeki for loops sorununa dair tartışma; odak noktası, closure'larda döngü değişkeninin hatalı kullanımı
  • Closure'larda döngü değişkeninin hatalı kullanımı yeni bir sorun değil; geçmişi 1992'deki Lisp diline kadar uzanıyor
  • C# dil ekibi de bu sorunla karşılaştı ve bunu çözmek için C# 5.0'da önemli bir değişiklik yaptı
  • Go 1.21, Go 1.22 sonrasını bildiren kodu derlemiyor; böylece yeni semantiğe dayanan kodun eski semantikle derlenmemesi garanti ediliyor
  • Bu değişikliğin mevcut davranışa bağımlı programları bozup bozmayacağına dair endişeler var
  • Bazı kullanıcılar, bir paketin 1.22'ye sabitlenip kullanıcının 1.18 ile derleme yapması durumunda bunun pratikte nasıl işleyeceğini sorguluyor
  • Bu değişikliğin bellek tahsisi ve döngü performansı üzerindeki etkisine dair sorular da var
  • Bazı kullanıcılar Python gibi diğer dillerde benzer sorunlar yaşadıklarına dair deneyimlerini paylaşıyor
  • Go 1.22'deki değişiklik, dil sözdizimindeki bir sorunu çözmenin bir yolu gibi görünüyor; ancak bazı kullanıcılara sezgisel gelmiyor, çünkü bir dosyadaki davranışı anlamak için başka bir dosyada bildirilen sürümü bilmek gerekiyor