Heim  >  Artikel  >  Backend-Entwicklung  >  Warum werden Go-Variablen überschrieben?

Warum werden Go-Variablen überschrieben?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-24 07:54:30791Durchsuche

Why are Go Variables Being Overwritten?

Go-Variablen werden überschrieben

In einer Go-Routine meldete ein Benutzer ein Problem, bei dem eine Variable überschrieben wurde, während eine andere festgelegt wurde. Konkret hat der Benutzer zwei Ganzzahllisten mit den Namen pathA und pathB erstellt. Als PfadA um einen neuen Wert aus einem Dreieck erweitert wurde, wurde dieser zunächst korrekt eingestellt, später jedoch von PfadB überschrieben.

Untersuchungen

Das Problem entsteht durch die gemeinsame Nutzung von Backing-Arrays zwischen Slices. Wenn in Go ein Slice über seine Kapazität hinaus erweitert wird, wird ein neues Backing-Array zugewiesen und die vorhandenen Elemente werden in das neue Array kopiert. Wenn die Länge des Slice jedoch geringer ist als seine Kapazität, teilen sich das Slice und seine angehängten Elemente dasselbe Backing-Array.

Im Code des Benutzers wurde mit zunehmender Größe von PfadA und PfadB ein Punkt erreicht, an dem Die Länge des Slice hat seine Kapazität überschritten und für pathA wurde ein neues Backing-Array zugewiesen. Da jedoch PfadB als nächstes erstellt wurde, wurde am Ende dasselbe Backing-Array verwendet.

Lösung

Um dieses Problem zu lösen, musste der Benutzer sicherstellen, dass sowohl PfadA als auch pathB verfügte über unabhängige Backing-Arrays. Dies wurde erreicht, indem mit make() manuell ein neues Slice für pathB zugewiesen und mit copy() die alten Daten kopiert wurden.

Überarbeiteter Code

Hier ist der geänderte Code :

<code class="go">for i := 0; i < len(prePaths); i++ {
    newRoute := make([]int, len(prePaths[i]), (cap(prePaths[i]) + 1) * 2)
    copy(newRoute, prePaths[i])

    nextA := nextLine[i]
    nextB := nextLine[i+1]

    pathA := append(newRoute, nextA)
    pathB := append(prePaths[i], nextB)

    postPaths = append(postPaths, pathA)
    postPaths = append(postPaths, pathB)
}</code>

Dieser Code stellt sicher, dass sowohl PfadA als auch PfadB über eigene Backing-Arrays verfügen, wodurch das Problem des Überschreibens verhindert wird.

Das obige ist der detaillierte Inhalt vonWarum werden Go-Variablen überschrieben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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