Heim >Backend-Entwicklung >Golang >Warum zeigen Slices, die aus demselben zugrunde liegenden Array erstellt wurden, unerwartetes Verhalten, wenn sie in Go angehängt werden?

Warum zeigen Slices, die aus demselben zugrunde liegenden Array erstellt wurden, unerwartetes Verhalten, wenn sie in Go angehängt werden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-04 02:15:29914Durchsuche

Why do slices created from the same underlying array exhibit unexpected behavior when appended to in Go?

Unerwartetes Slice-Anhängeverhalten

In Go kann das Anhängen von Elementen an ein Slice innerhalb einer Schleife die Werte vorhandener Slices, die aus demselben zugrunde liegenden Array erstellt wurden, unerwartet ändern.

Ursprung des Problems

Das Problem ergibt sich aus der Art und Weise, wie Slices auf die zugrunde liegenden Array-Werte verweisen. Wenn Sie an ein Slice anhängen, wird möglicherweise das vorhandene Array geändert oder ein neues erstellt. Wenn das Slice jedoch mit der Make-Funktion erstellt wurde, verweist es immer auf dasselbe zugrunde liegende Array.

Beispiel

Betrachten Sie den folgenden Code:

<code class="go">func create(iterations int) []int {
    a := make([]int, 0)
    for i := 0; i < iterations; i++ {
        a = append(a, i)
    }
    return a
}

func main() {
    sliceFromLoop()
    sliceFromLiteral()
}

func sliceFromLoop() {
    i := create(11)
    j := append(i, 100)
    g := append(i, 101)
    h := append(i, 102)
    fmt.Printf("i: %v\nj: %v\ng: %v\nh:%v\n", i, j, g, h)
}

func sliceFromLiteral() {
    i := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    j := append(i, 100)
    g := append(i, 101)
    h := append(i, 102)
    fmt.Printf("i: %v\nj: %v\ng: %v\nh:%v\n", i, j, g, h)
}</code>

Im SliceFromLoop Funktion teilen alle neuen Slices (j, g, h) dasselbe zugrunde liegende Array wie das anfängliche Slice i. Das bedeutet, dass beim Anhängen an i das letzte Element aller anderen Slices geändert wird.

Lösung

Um dieses Verhalten zu vermeiden, wird empfohlen, vor dem Anhängen eine Kopie des Slice zu erstellen dazu. Die Kopierfunktion weist ein neues Slice mit denselben Elementen wie das Original zu.

<code class="go">func sliceFromLoopFixed() {
    i := create(11)
    j := append([]int{}, i..., 100)
    g := append([]int{}, i..., 101)
    h := append([]int{}, i..., 102)
    fmt.Printf("i: %v\nj: %v\ng: %v\nh:%v\n", i, j, g, h)
}</code>

In diesem Fall haben die neuen Slices j, g und h ihre eigenen zugrunde liegenden Arrays, sodass der Wert von i unberührt bleibt durch die Anhänge.

Das obige ist der detaillierte Inhalt vonWarum zeigen Slices, die aus demselben zugrunde liegenden Array erstellt wurden, unerwartetes Verhalten, wenn sie in Go 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