Heim >Backend-Entwicklung >Golang >Warum wirkt sich das Mischen eines Slice auf ein anderes Slice aus, das auf dasselbe zugrunde liegende Array verweist?

Warum wirkt sich das Mischen eines Slice auf ein anderes Slice aus, das auf dasselbe zugrunde liegende Array verweist?

Susan Sarandon
Susan SarandonOriginal
2024-10-26 22:44:02365Durchsuche

Why Does Shuffling a Slice Affect Another Slice Referencing the Same Underlying Array?

Array-Behandlung in Go verstehen

Die Dokumentation unter http://golang.org/doc/ Effective_go.html#arrays unterstreicht die wertbasierte Natur von Arrays in Go: Durch die Zuweisung eines Arrays zu einem anderen wird eine Kopie aller Elemente erstellt. Dieses Prinzip gilt auch für Funktionsargumente, bei denen die Funktion eine Kopie des Arrays und keinen Zeiger erhält.

Basierend auf diesen Informationen würde man erwarten, dass der folgende Code zu unterschiedlichen Arrays für arr2 und arr im führt main()-Funktion:

<code class="go">package main

import (
    "fmt"
    "rand"
    "time"
)

func shuffle(arr []int) {
    rand.Seed(time.Nanoseconds())
    for i := len(arr) - 1; i > 0; i-- {
        j := rand.Intn(i)
        arr[i], arr[j] = arr[j], arr[i]
    }
}

func main() {
    arr := []int{1, 2, 3, 4, 5}
    arr2 := arr
    shuffle(arr)
    for _, i := range arr2 {
        fmt.Printf("%d ", i)
    }
}</code>

Allerdings mischt der Code unerwartet auch arr2. Dieses Verhalten ergibt sich aus der Tatsache, dass der bereitgestellte Code mit Slices und nicht mit Arrays arbeitet.

Slices: Eine Referenz zu Arrays

Go nutzt Slices als flexiblere und effizientere Möglichkeit, Wertesequenzen zu verarbeiten . Slices sind Verweise auf zugrunde liegende Arrays, und die Zuweisung eines Slice zu einem anderen dupliziert einfach die Referenz.

Im Beispielcode erstellt die Zeile arr := []int{1, 2, 3, 4, 5} eine Slice, das auf ein anonymes zugrunde liegendes Array von Ganzzahlen verweist. Wenn arr2 := arr ausgeführt wird, wird ein neues Slice erstellt, das auch auf dasselbe zugrunde liegende Array verweist.

Auswirkungen auf die Array-Behandlung

Da arr und arr2 beide auf dasselbe zugrunde liegende Array verweisen, ändert sich arr in der Funktion shuffle() wirkt sich auch auf arr2 aus. Dieses Verhalten steht im Einklang mit dem Prinzip, ein Slice einem anderen zuzuweisen und dabei einfach die Referenz zu duplizieren und keine neue Kopie des zugrunde liegenden Arrays zu erstellen.

Daher mischt der Code sowohl arr als auch arr2 korrekt, da beide auf dasselbe zugrunde liegende Array verweisen Array von ganzen Zahlen.

Das obige ist der detaillierte Inhalt vonWarum wirkt sich das Mischen eines Slice auf ein anderes Slice aus, das auf dasselbe zugrunde liegende Array verweist?. 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