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.
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.
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.
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.
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!