Datenwettlauf im Goroutine-Verhalten
Das bereitgestellte Code-Snippet führt zu einem Datenwettlaufproblem, das zu unvorhersehbaren Ergebnissen führen kann. Das Kernproblem ergibt sich aus der Natur von Goroutinen und der Art und Weise, wie die Bereichsvariable an die Funktion der Goroutine übergeben wird.
Der Datenwettlauf
Der bereitgestellte Code verwendet einen Bereich Schleife über den Datenausschnitt und startet für jede Iteration eine neue Goroutine, um das Namensfeld der Feldstruktur zu drucken. Innerhalb jeder Iteration zeigt die Bereichsvariable v jedoch auf dieselbe zugrunde liegende Datenstruktur im Datenausschnitt, die eine Referenz ist.
Während die Schleife fortschreitet und die Variable v den Datenausschnitt durchläuft, ändert sich ihr Wert in auf das nächste Element zeigen. Dies bedeutet, dass die Funktion der Goroutine zum Zeitpunkt der Ausführung den letzten Wert von v hat, was das letzte Element im Slice ist.
Daher führt die Ausführung der Goroutinen dazu, dass das Namensfeld von gedruckt wird nur das letzte Element, „drei“, dreimal anstelle des beabsichtigten „eins“, „zwei“, „drei“ in jedem bestellen.
Lösungen
Um dieses Problem zu beheben, stehen mehrere Lösungen zur Verfügung:
Erstellen Sie eine neue Variable :
Verwenden Sie ein Slice von Zeigern:
Verwenden Sie die Adresse des Slice-Elements:
Zusätzliche Ansätze
Das obige ist der detaillierte Inhalt vonWarum führt dieser Goroutine-Code zu unerwarteten Ergebnissen und wie können Datenrennen vermieden werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!