Heim >Backend-Entwicklung >Golang >Warum ändert das Ändern eines Arrays innerhalb einer Funktion in Go auch eine Variable, die demselben Array außerhalb der Funktion zugewiesen ist?
Behandlung von Arrays in Go
In Go sind Arrays Werte, keine Referenzen. Wenn Sie also ein Array einem anderen zuweisen, werden alle Elemente kopiert. Darüber hinaus stellt die Übergabe eines Arrays an eine Funktion eine Kopie und keinen Zeiger bereit.
Erklärung des Beispielcodes
Betrachten Sie das folgende Codebeispiel:
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) } }
In diesem Code nimmt die Shuffle-Funktion ein Array als Eingabe und mischt seine Elemente. Auch wenn wir das ursprüngliche Array vor dem Aufruf von shuffle einer neuen Variablen arr2 zuweisen, werden Änderungen, die innerhalb der Funktion an arr vorgenommen werden, in arr2 widergespiegelt.
Slices vs. Arrays
Go unterscheidet zwischen Slices und Arrays. Während es sich bei Arrays um Wertelisten fester Länge handelt, handelt es sich bei Slices um Verweise auf zugrunde liegende Arrays. Im Codebeispiel verweisen sowohl arr als auch arr2 auf dasselbe zugrunde liegende Array. Daher werden alle an arr vorgenommenen Änderungen auch auf arr2 angewendet. Um eine eindeutige Kopie eines Arrays zu erstellen, muss das Slice mit make zugewiesen werden:
arr := []int{1, 2, 3, 4, 5} arr2 := make([]int, len(arr)) copy(arr2, arr)
In dieser aktualisierten Version ist arr2 kein Verweis mehr auf das ursprüngliche Array, sodass an arr vorgenommene Änderungen keine Auswirkungen haben arr2.
Das obige ist der detaillierte Inhalt vonWarum ändert das Ändern eines Arrays innerhalb einer Funktion in Go auch eine Variable, die demselben Array außerhalb der Funktion zugewiesen ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!