„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum kommt es in Go beim Anhängen an Slices aus demselben Array zum Überschreiben von Variablen?

Warum kommt es in Go beim Anhängen an Slices aus demselben Array zum Überschreiben von Variablen?

Veröffentlicht am 10.11.2024
Durchsuche:815

Why Does Variable Overwrite Occur in Go When Appending to Slices from the Same Array?

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 desselben Typs darstellt.
  • Slices haben eine Länge (die Anzahl der aktuell gespeicherten Elemente). ) und eine Kapazität (die maximale Anzahl von Elementen, die es aufnehmen kann).
  • Wenn Sie ein Slice ändern, kann dies die Zuweisung eines neuen Backing-Arrays auslösen, wenn die Kapazität vorhanden ist überschritten.

Problem mit Ihrem Code:

In Ihrem Code erstellen Sie zwei neue Slices, PfadA und PfadB, mithilfe der Append-Funktion:

pathA := append(route, nextA)
pathB := append(route, nextB)

Das passiert:

  1. Route hat zunächst eine Kapazität, die sowohl für nextA als auch für nextB geeignet ist. Es werden also zwei neue Slices (PfadA und PfadB) mit demselben Backing-Array wie die Route erstellt.
  2. Während die Schleife fortschreitet und Sie weiterhin an die Route anhängen, übersteigt ihre Kapazität schließlich ihre Länge.
  3. 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.
  4. 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.
  5. Als Ergebnis erhalten sowohl PfadA als auch PfadB das gleiche Finale Wert.

Lösung:

Um dieses Überschreiben zu vermeiden, müssen Sie sicherstellen, dass PfadA und PfadB eindeutige Backing-Arrays haben. Sie können dies erreichen, indem Sie manuell ein neues Slice für eines davon erstellen, indem Sie make und copy verwenden:

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)
}
Freigabeerklärung Dieser Artikel wird unter folgender Adresse abgedruckt: 1729727920 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3