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

Mary-Kate Olsen
Freigeben: 2024-10-24 08:11:01
Original
396 Leute haben es durchsucht

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 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:

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

Quelle:php
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!