Heim >Backend-Entwicklung >Golang >Warum werden Go-Variablen überschrieben, wenn mehrere Slices angehängt werden?

Warum werden Go-Variablen überschrieben, wenn mehrere Slices angehängt werden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-24 07:59:02273Durchsuche

Why Are Go Variables Overwritten When Multiple Slices Are Appended?

Go-Variablen werden überschrieben (Fehler?)

Dieses Problem tritt auf, wenn mehrere Variablen festgelegt werden, die jeweils durch Anhängen eines Elements an einen vorhandenen Slice definiert werden , aber eine Variable wird überschrieben, wenn die zweite gesetzt wird.

Betrachten Sie den folgenden Codeausschnitt:

<code class="go">for i := 0; i < len(prePaths); i++ {
    route := prePaths[i]
    nextA := nextLine[i]
    nextB := nextLine[i+1]

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

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

Das Problem liegt in der zweiten Zeile der Schleife, wo sowohl 'pathA' als auch „pathB“ sind als Slices definiert, denen ein Element angehängt ist. Durch das Anhängen an ein Slice wird jedoch kein neues Slice erstellt. Stattdessen wird das vorhandene Slice geändert.

In diesem Szenario ist „route“ das vorhandene Slice, an das angehängt wird. Wenn also „pathA“ erstellt wird, nutzt es dasselbe zugrunde liegende Array wie „route“. Wenn anschließend „PfadB“ erstellt wird, teilt es auch dasselbe Array wie „PfadA“.

Da „PfadB“ das letzte Slice ist, an das angehängt wird, wird das letzte Element im zugrunde liegenden Array auf den angehängten Wert gesetzt zu 'pathB'. Daher spiegelt auch „pathA“, das dasselbe Array nutzt, diese Änderung wider. Dies erklärt, warum „PfadA“ überschrieben wird, wenn „PfadB“ festgelegt ist.

Um dieses Problem zu beheben, müssen unabhängige Slices für „PfadA“ und „PfadB“ erstellt werden. Dies kann durch die Verwendung der Funktionen „make“ und „copy“ erreicht werden.

Hier ist ein modifizierter Codeausschnitt, der unabhängige Slices erstellt:

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

In diesem Code ist „newRoute“ ein Mit der Funktion „make“ wird ein neues Slice erstellt, um sicherzustellen, dass es über unabhängige Daten verfügt. Die Funktion „Kopieren“ wird dann verwendet, um Daten von „prePaths[i]“ in den neuen Slice „newRoute“ zu kopieren. Anschließend werden „PfadA“ und „PfadB“ mithilfe unabhängiger Slices definiert, wodurch das ursprüngliche Problem gelöst wird.

Das obige ist der detaillierte Inhalt vonWarum werden Go-Variablen überschrieben, wenn mehrere Slices angehängt werden?. 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