- 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
Hacker-News-Kommentare
for-Schleifen inGo 1.22, mit Fokus auf die fehlerhafte Verwendung von Schleifenvariablen in Closures