„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > 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?

Veröffentlicht am 11.11.2024
Durchsuche:838

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

Array-Verarbeitung 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 und keine Speicherreferenz erhält.

Ursprüngliche Frage

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

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

Der Autor äußerte Verwirrung darüber, warum arr2 von der Shuffle-Funktion betroffen war, obwohl er davon ausging, 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 Wertesammlungen fester Länge, während Slices dynamische Verweise auf zugrunde liegende Arrays sind. 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.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3