Heim >Backend-Entwicklung >Golang >Wie gehen die „for...range'-Schleifen von Go mit Abschlussvariablen um und wie kann ich unerwartetes Verhalten vermeiden?
Erfasster Abschluss in Go: Verständnis des Verhaltens von Range-Loop-Variablen
In Go verhalten sich for...range-Schleifen anders als andere for- Schleifen aufgrund ihrer Behandlung als Verschluss. In diesem Artikel werden die Nuancen der Erfassung von Bereichsschleifenvariablen innerhalb von Abschlussvariablen untersucht.
Erfasstes Abschlussverhalten in Bereichsschleifen
Im Gegensatz zu den foreach-Schleifen von C# gilt bei Go for...range Schleifen erfassen die Schleifenvariablen (z. B. Schlüssel und Werte) als Abschlussvariablen. Allerdings erfasst Go diese Variablen nicht direkt aus dem Schleifenbereich. Stattdessen werden sie als die zuletzt zugewiesenen Werte innerhalb des Schleifenabschlusses erfasst.
Dieses Verhalten wird deutlich, wenn versucht wird, Abschlüsse zum Erstellen von Tupeln in Go zu verwenden, wie im Beispielcode gezeigt. Der Abschluss erfasst die letzten Werte, die den k- und v-Variablen während der for...range-Schleife zugewiesen wurden, was zu falschem Verhalten führt.
Fix: Variablen für die Erfassung kopieren
Um dieses Problem zu beheben, ist es notwendig, die Schleifenvariablen mithilfe des :=-Operators explizit in lokale Variablen zu kopieren, bevor sie im Abschluss erfasst werden.
for k, v := range m { kLocal, vLocal := k, v // Copy values to local variables f[i] = func() { return kLocal, vLocal } }
Von Durch das Kopieren von k und v nach kLocal und vLocal kann der Abschluss jetzt während der for...range-Iteration korrekt auf die beabsichtigten Werte für die Schleifenvariable zugreifen.
Abschluss vs. Funktionsliteral
Es ist wichtig, den Unterschied zwischen Abschlüssen und Funktionsliteralen in Go zu beachten. Funktionsliterale erstellen eine neue Funktion, die an den aktuellen Bereich gebunden ist, während Abschlüsse den Zugriff auf ihren umschließenden Bereich und gemeinsam genutzte Variablen behalten.
Wertschleife vs. Variablenschleife
Zusätzlich gilt: Go unterscheidet zwischen Werteschleifen und Variablenschleifen, wobei die Werteschleife eine Kopie der Schleifenvariablen an jeden Abschluss bindet, während die Variablenschleife die eigentliche Schleifenvariable selbst bindet. Dies kann zu unterschiedlichem Verhalten führen, wie im Beispielcode beobachtet.
Zusammenfassend lässt sich sagen, dass die Erfassung von Bereichsschleifenvariablen innerhalb von Abschlüssen in Go die Beachtung des Umfangs des Abschlusses und die Verwendung lokaler Variablen zum Kopieren der gewünschten Werte erfordert. Das Verständnis dieser Konzepte ist für das Schreiben effektiven und robusten Go-Codes unerlässlich.
Das obige ist der detaillierte Inhalt vonWie gehen die „for...range'-Schleifen von Go mit Abschlussvariablen um und wie kann ich unerwartetes Verhalten vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!