


Wie gehen Go-Closures mit For-Schleifenvariablen um und verhindern unerwartetes Verhalten?
Dec 29, 2024 am 08:41 AMAbschluss (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!

Heißer Artikel

Hot-Tools-Tags

Heißer Artikel

Heiße Artikel -Tags

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich?

Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go?

Wie kann ich kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren?

Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen?

Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren?

Wie konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache?

Wie schreibe ich Dateien in Go Language bequem?

Wie kann ich Linter und statische Analyse -Tools verwenden, um die Qualität und Wartbarkeit meines GO -Codes zu verbessern?
