Ursache für das Überschreiben von Variablen in Go
Ihr Code stößt auf ein Problem beim Überschreiben von Variablen, weil Sie neue Slices (PfadA und PfadB) erstellen, indem Sie Elemente an dasselbe Backing-Array anhängen (Route) innerhalb einer Schleife.
Hintergrund zu Slices in Go:
- Ein Go-Slice ist eine Datenstruktur, die einen zusammenhängenden Block von Elementen des darstellt gleichen Typs.
- Slices haben eine Länge (die Anzahl der aktuell gespeicherten Elemente) und eine Kapazität (die maximale Anzahl an Elementen, die sie aufnehmen können).
- Wenn Sie ein Slice ändern, kann es ausgelöst werden die Zuweisung eines neuen Backing-Arrays, wenn die Kapazität überschritten wird.
Problem mit Ihrem Code:
In Ihrem Code erstellen Sie zwei neue Slices, pathA und pathB unter Verwendung der Append-Funktion:
pathA := append(route, nextA)
pathB := append(route, nextB)
Nach dem Login kopieren
Das passiert:
- Anfangs hat die Route eine Kapazität, die sowohl nextA als auch nextB aufnehmen kann. Es werden also zwei neue Slices (PfadA und PfadB) mit demselben Backing-Array wie die Route erstellt.
- Während die Schleife fortschreitet und Sie weiterhin an die Route anhängen, übersteigt ihre Kapazität schließlich ihre Länge.
- In der anschließenden Iteration der Schleife wird der Route ein neues Backing-Array zugewiesen. PfadA und PfadB verweisen jedoch immer noch auf das alte Backing-Array.
- Wenn Sie nextB an die Route anhängen, schreibt es in das letzte Element des alten Backing-Arrays, das sowohl von PathA als auch von PathB gemeinsam genutzt wird.
- Dadurch haben sowohl PfadA als auch PfadB denselben Endwert.
Lösung:
Um dieses Überschreiben zu vermeiden, müssen Sie Folgendes tun Stellen Sie sicher, dass PfadA und PfadB über eindeutige Backing-Arrays verfügen. Sie können dies erreichen, indem Sie manuell mit make und copy:
newRoute := make([]int, len(route), (cap(route)+1)*2)
copy(newRoute, route)
if i % 2 == 0 {
pathA := append(newRoute, nextA)
} else {
pathB := append(newRoute, nextB)
}
Nach dem Login kopieren
ein neues Slice für eines davon erstellen
Das obige ist der detaillierte Inhalt vonWarum kommt es in Go beim Anhängen an Slices aus demselben Array zum Überschreiben von Variablen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!