1 Punkte von GN⁺ 2023-09-20 | 1 Kommentare | Auf WhatsApp teilen
  • Das kommende Release von Go 1.22 soll einen häufigen Fehler im Geltungsbereich von for-Schleifen beheben, der in vielen Unternehmen zu Problemen im Produktivbetrieb geführt hat.
  • Das Problem tritt auf, wenn nach dem Ende einer Iteration weiterhin eine Referenz auf die Schleifenvariable besteht und diese dadurch unbeabsichtigt einen neuen Wert erhält.
  • Dieses Problem ist sowohl in nebenläufigem als auch in nicht-nebenläufigem Go-Code verbreitet und war wegen der Komplexität, zu analysieren, ob Referenzen auf Variablen über eine Iteration hinaus bestehen, schwer zu erkennen und zu beheben.
  • Bestehende Werkzeuge zum Erkennen solcher Fehler führen oft zu falsch-negativen oder falsch-positiven Ergebnissen und verursachen dadurch unnötige Codeänderungen oder übersehene Probleme.
  • Die für Go 1.22 vorgeschlagene Korrektur ändert for-Schleifen so, dass sie einen Geltungsbereich pro Schleifendurchlauf statt pro Schleife haben, wodurch diese Art von Fehlern und die Notwendigkeit ungenauer Werkzeuge entfällt.
  • Um die Abwärtskompatibilität zu wahren, gilt die neue Semantik nur für Pakete in Modulen, die in der go.mod-Datei Go 1.22 oder höher deklarieren.
  • Entwickler können steuern, wann sich die Semantik in bestimmten Paketen ändert, und bestehender Code wird weiterhin wie bisher funktionieren.
  • Go 1.21 enthält eine Vorschau auf die Änderung des Geltungsbereichs, die durch Setzen von GOEXPERIMENT=loopvar in der Umgebung aktiviert werden kann.
  • Diese Änderung wurde bei Google umfassend getestet, und es wurden keine Probleme in produktivem Code gemeldet.
  • Einige Tests mussten jedoch angepasst werden, weil sie aufgrund des Problems mit Schleifenvariablen ursprünglich nicht das testeten, was sie eigentlich prüfen sollten.
  • Der loopclosure-Analyzer in Go 1.21 wurde verbessert, um diese Art von Problem zu erkennen und zu melden, sodass Entwickler sich auf die Änderungen in Go 1.22 vorbereiten können.
  • Weitere Informationen zu dieser Änderung finden sich im Designdokument und in den FAQ.

1 Kommentare

 
GN⁺ 2023-09-20
Hacker-News-Kommentare
  • Diskussion über das Problem mit for-Schleifen in Go 1.22, mit Fokus auf die fehlerhafte Verwendung von Schleifenvariablen in Closures
  • Das Problem der fehlerhaften Verwendung von Schleifenvariablen in Closures ist nicht neu und reicht bis zur Lisp-Sprache von 1992 zurück
  • Auch das C#-Sprachteam stand vor diesem Problem und nahm in C# 5.0 eine bedeutende Änderung vor, um es zu beheben
  • Go 1.21 kompiliert keinen Code, der Go 1.22 oder höher deklariert, und stellt so sicher, dass Code, der von der neuen Semantik abhängt, nicht mit der alten Semantik kompiliert wird
  • Es gibt Bedenken, ob diese Änderung Programme kaputt machen könnte, die vom bisherigen Verhalten abhängen
  • Einige Nutzer fragen sich, wie das in der Praxis funktioniert, wenn ein Paket auf 1.22 festgelegt ist und der Nutzer mit 1.18 kompiliert
  • Es gibt auch Fragen zu den Auswirkungen dieser Änderung auf Speicherallokation und Schleifen-Performance
  • Einige Nutzer teilen Erfahrungen mit ähnlichen Problemen in anderen Sprachen wie Python
  • Die Änderung in Go 1.22 scheint ein Problem der Sprachsyntax zu lösen, wirkt auf manche Nutzer jedoch nicht intuitiv, weil man die in einer Datei deklarierte Version kennen muss, um das Verhalten anderer Dateien zu verstehen