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