Go 1.21, das letzten Monat offiziell veröffentlicht wurde, hat die Semantik von for-Schleifenvariablen geändert (im Vorschaustadium klicken Sie hier, um Details anzuzeigen ).
Nun sagt das Go-Team, dass Go 1.22 diese Funktion als offizielle Funktion veröffentlichen wird .
Laut Russ Cox (rsc), technischer Leiter des Go-Entwicklungsteams, besteht ein häufiger Fehler, den Go-Entwickler machen, darin, einen Verweis auf die Schleifenvariable beizubehalten, nachdem die Schleifeniteration beendet ist und sie dann einen unerwarteten neuen Wert annimmt.
Zum Beispiel das folgende Programm:
func main() {
done := make(chan bool)
values := []string{"a", "b", "c"}
for _, v := range values {
go func() {
fmt.Println(v)
done <- true
}()
}
// wait for all goroutines to complete before exiting
for _ = range values {
<-done
}
}
Die drei von ihm erstellten Goroutinen werden alle zum Drucken derselben Variablen verwendet v
, sodass sie nur „c“, „c“, „c“ und nicht „a“, „b“ und „c“ der Reihe nach ausgeben.
Ab Go1.21 können Entwickler GOEXPERIMENT=loopvar
die Erstellung von Go-Programmen ermöglichen, um das oben erwähnte Problem mit for-Schleifenvariablen zu lösen.
Build-Befehl:
GOEXPERIMENT=loopvar go install my/program
GOEXPERIMENT=loopvar go build my/program
GOEXPERIMENT=loopvar go test my/program
GOEXPERIMENT=loopvar go test my/program -bench=.
...
Nun teilt das Go-Entwicklungsteam mit, dass ab Go1.22 die neue for-Schleifensemantik standardmäßig aktiviert wird, wenn die Go-Version in der Datei go.mod größer oder gleich Go1.22 ist.