Heim >Backend-Entwicklung >Golang >Warum wirkt sich das Mischen eines Slice auf ein ihm in Go zugewiesenes Slice aus?

Warum wirkt sich das Mischen eines Slice auf ein ihm in Go zugewiesenes Slice aus?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-27 03:57:031111Durchsuche

Why does shuffling a slice affect a slice assigned to it in Go?

Array-Handhabung in Go

In Go sind Arrays Werttypen, und durch die Zuweisung eines Arrays zu einem anderen wird eine Kopie aller seiner Elemente erstellt. Dies gilt auch dann, wenn ein Array an eine Funktion übergeben wird, da diese eine Kopie statt einer Speicherreferenz erhält.

Ursprüngliche Frage

Es wurde eine Anfrage bezüglich der gestellt Folgender Code:

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

Der Autor äußerte Verwirrung darüber, warum arr2 von der Shuffle-Funktion betroffen war, obwohl er erwartete, dass arr2 und arr unterschiedliche Einheiten sind.

Klarstellung

Das Problem ist auf ein Missverständnis zwischen Arrays und Slices zurückzuführen.

Arrays vs. Slices

Arrays sind Sammlungen von Werten fester Länge, während Slices sind dynamische Verweise auf zugrunde liegende Arrays. Im bereitgestellten Codebeispiel werden keine Arrays verwendet.

Slice-Manipulation

Die Zeile arr := []int{1, 2, 3, 4, 5} Erstellt ein Slice, das auf ein anonymes zugrunde liegendes Array verweist. Die nachfolgende Zeile arr2 := arr dupliziert einfach diese Referenz, was dazu führt, dass sowohl arr als auch arr2 auf dasselbe zugrunde liegende Array verweisen.

Funktionsverhalten

Bei der Übergabe von arr an Bei der Shuffle-Funktion wird eine Kopie des Slice erstellt, nicht des zugrunde liegenden Arrays. Diese Kopie wird durch die Funktion geändert, weshalb arr2 auch betroffen ist, wenn arr geändert wird.

Fazit

In Go verhalten sich Slices als Referenzen auf zugrunde liegende Arrays. Durch die Zuweisung eines Slice zu einem anderen wird die Referenz kopiert, nicht das zugrunde liegende Array. Dieses Konzept ist entscheidend für das Verständnis der Slice-Manipulation in Go.

Das obige ist der detaillierte Inhalt vonWarum wirkt sich das Mischen eines Slice auf ein ihm in Go zugewiesenes Slice aus?. 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