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!