Heim >Backend-Entwicklung >Golang >Wie gehen Go-Closures mit For-Schleifenvariablen um und verhindern unerwartetes Verhalten?

Wie gehen Go-Closures mit For-Schleifenvariablen um und verhindern unerwartetes Verhalten?

Barbara Streisand
Barbara StreisandOriginal
2024-12-29 08:41:14780Durchsuche

How Do Go Closures Handle For Loop Variables and Prevent Unexpected Behavior?

Abschluss (für Schleifenvariable) in Go erfassen

For-Schleifen in Go sind nicht wie foreach-Schleifen in C#, wo sich Schleifenvariablen innerhalb des Schleifenkörpers nicht ändern können. In Go können Schleifenvariablen geändert werden, was dazu führt, dass das erfasste Abschlussverhalten anders gehandhabt werden muss.

Unterschiede bei der Erfassung

Zur Veranschaulichung untersuchen wir drei Codes Schnipsel:

Lab1:

l := [](func() (int32, int32)){}
for k, v := range m {
    // Closure captures the last values assigned to k and v from the range
    l = append(l, func() (int32, int32) { return k, v })
}

Lab2:

l := [](func() (int32, int32)){}
for k, v := range m {
    // Closure captures the outer variables k and v (which are modified in the loop)
    l = append(l, func() (int32, int32) { return k, v })
}

Lab3:

l := [](func() (int32, int32)){}
for k, v := range m {
    kLocal, vLocal := k, v // Captures just the values assigned to k and v at the iteration
    l = append(l, func() (int32, int32) { return kLocal, vLocal })
}

Variable erfassen oder Wert

In Lab1 und Lab2 erfassen die Abschlüsse die letzten Werte, die Schleifenvariablen innerhalb des Schleifenkörpers zugewiesen wurden. Dies kann zu falschen Ergebnissen führen, wenn Schleifenvariablen innerhalb der Schleife geändert werden.

Lab3 demonstriert den richtigen Ansatz. Es erfasst die den Schleifenvariablen zugewiesenen Werte speziell innerhalb jeder Iteration mithilfe lokaler Variablen. Dieses Verhalten stimmt mit Abschlüssen in Go überein, wo erfasste Variablen standardmäßig referenziell transparent sind.

Fazit

In Go erfassen Abschlüsse über for-Schleifenvariablen Werte statt Referenzen. Um Werte zu erfassen, die sich während der Schleife ändern können, müssen innerhalb jeder Iteration lokale Variablen erstellt werden, die dem Abschluss die gewünschten Werte zuweisen. Dieser Ansatz stellt sicher, dass das Schließverhalten den Erwartungen entspricht.

Das obige ist der detaillierte Inhalt vonWie gehen Go-Closures mit For-Schleifenvariablen um und verhindern unerwartetes Verhalten?. 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
Vorheriger Artikel:Go Iter-PaketNächster Artikel:Go Iter-Paket