Inhaltsverzeichnis
Abschluss (für Schleifenvariable) in Go erfassen
Unterschiede bei der Erfassung
Variable erfassen oder Wert
Fazit
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?

Dec 29, 2024 am 08:41 AM

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 })
}
Nach dem Login kopieren

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 })
}
Nach dem Login kopieren

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 })
}
Nach dem Login kopieren

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!

Erklärung dieser Website
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

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich? GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich? Mar 03, 2025 pm 05:17 PM

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

Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go? Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go? Mar 10, 2025 pm 05:38 PM

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 kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren? Mar 03, 2025 pm 05:22 PM

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 Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen? Mar 10, 2025 pm 05:36 PM

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 kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren? Mar 10, 2025 pm 03:20 PM

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 konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache? Mar 03, 2025 pm 05:18 PM

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 schreibe ich Dateien in Go Language bequem? Mar 03, 2025 pm 05:15 PM

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? Wie kann ich Linter und statische Analyse -Tools verwenden, um die Qualität und Wartbarkeit meines GO -Codes zu verbessern? Mar 10, 2025 pm 05:38 PM

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

See all articles