Heim > Backend-Entwicklung > Golang > Warum unterscheidet sich das Schleifenverhalten von Golang bei der Verwendung von Referenzen und Kopien von Schleifenvariablen?

Warum unterscheidet sich das Schleifenverhalten von Golang bei der Verwendung von Referenzen und Kopien von Schleifenvariablen?

DDD
Freigeben: 2024-12-29 01:05:10
Original
965 Leute haben es durchsucht

Why Does Golang's Loop Behavior Differ When Using References vs. Copies of Loop Variables?

Unterschiedliches Schleifenverhalten in Golang verstehen: Rückgabe durch Referenz vs. Kopieren

Das Problem

Im bereitgestellten Code weisen zwei Schleifenvarianten unterschiedliche Verhaltensweisen auf beim Zugriff auf Elemente aus einem Slice. Loop1 gibt „update“ wiederholt zurück, während Loop2 die erwartete Sequenz von „delete“, „update“ und „create“ ausgibt.

Loop-Variablenreferenz

Der Schlüssel zum Verständnis dieses Unterschieds liegt darin die Art und Weise, wie die Schleifenvariable (cmd) im Abschluss (func()) verwendet wird. In Loop1 wird im Abschluss ein Verweis auf die Schleifenvariable gespeichert. Das bedeutet, dass sich alle nachfolgenden Änderungen an cmd auf alle Schließungen in der Karte auswirken.

Wenn die zweite Schleife ausgeführt wird, wurde der Wert von cmd bereits auf „update“ aktualisiert, das letzte Element im cmds-Slice. Daher beziehen sich alle Abschlüsse in der Karte auf diesen letzten Wert, was zur wiederholten „Update“-Ausgabe führt.

Kopieren von Schleifenvariablen

In Loop2 befindet sich jedoch eine Kopie der Schleifenvariablen im Verschluss aufbewahrt. Dadurch wird eine getrennte Variable erstellt, die von späteren Änderungen am ursprünglichen cmd nicht betroffen ist. Jede Iteration der Schleife weist cmd2 einen anderen Wert zu, auf den der Abschluss dann verweist.

Dadurch druckt die zweite Schleife jedes Element des cmds-Slice korrekt aus.

Best Practice

Um solche Referenzprobleme zu vermeiden, wird im Allgemeinen empfohlen, beim Zugriff auf Elemente innerhalb eines Abschlusses den Index des Slice anstelle der Schleifenvariablen zu verwenden. Auf diese Weise kann jeder Abschluss unabhängig von Änderungen an der Schleifenvariablen auf das richtige Element zugreifen.

Anwendungsfall für zurückgegebenes Element

Der zweite von der Bereichsschleife zurückgegebene Wert (eine Kopie des Elements) kann nützlich sein, wenn Sie den Wert an eine separate Goroutine oder einen separaten Thread übergeben möchten, ohne sich Gedanken über den gleichzeitigen Zugriff auf die ursprüngliche Variable machen zu müssen. Dies macht es praktisch für Aufgaben, die den Austausch von Daten erfordern, ohne befürchten zu müssen, dass die Quelle beschädigt wird.

Das obige ist der detaillierte Inhalt vonWarum unterscheidet sich das Schleifenverhalten von Golang bei der Verwendung von Referenzen und Kopien von Schleifenvariablen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage