Heim >Backend-Entwicklung >Golang >Wie gehen die „for...range'-Schleifen von Go mit Abschlussvariablen um und wie kann ich unerwartetes Verhalten vermeiden?

Wie gehen die „for...range'-Schleifen von Go mit Abschlussvariablen um und wie kann ich unerwartetes Verhalten vermeiden?

Linda Hamilton
Linda HamiltonOriginal
2024-12-30 08:33:02979Durchsuche

How Do Go's `for...range` Loops Handle Closure Variables, and How Can I Avoid Unexpected Behavior?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn