Heim >Backend-Entwicklung >Golang >Warum wirkt sich das Mischen eines Slice auf ein anderes Slice aus, das auf dasselbe zugrunde liegende Array verweist?
Die Dokumentation unter http://golang.org/doc/ Effective_go.html#arrays unterstreicht die wertbasierte Natur von Arrays in Go: Durch die Zuweisung eines Arrays zu einem anderen wird eine Kopie aller Elemente erstellt. Dieses Prinzip gilt auch für Funktionsargumente, bei denen die Funktion eine Kopie des Arrays und keinen Zeiger erhält.
Basierend auf diesen Informationen würde man erwarten, dass der folgende Code zu unterschiedlichen Arrays für arr2 und arr im führt main()-Funktion:
<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>
Allerdings mischt der Code unerwartet auch arr2. Dieses Verhalten ergibt sich aus der Tatsache, dass der bereitgestellte Code mit Slices und nicht mit Arrays arbeitet.
Go nutzt Slices als flexiblere und effizientere Möglichkeit, Wertesequenzen zu verarbeiten . Slices sind Verweise auf zugrunde liegende Arrays, und die Zuweisung eines Slice zu einem anderen dupliziert einfach die Referenz.
Im Beispielcode erstellt die Zeile arr := []int{1, 2, 3, 4, 5} eine Slice, das auf ein anonymes zugrunde liegendes Array von Ganzzahlen verweist. Wenn arr2 := arr ausgeführt wird, wird ein neues Slice erstellt, das auch auf dasselbe zugrunde liegende Array verweist.
Da arr und arr2 beide auf dasselbe zugrunde liegende Array verweisen, ändert sich arr in der Funktion shuffle() wirkt sich auch auf arr2 aus. Dieses Verhalten steht im Einklang mit dem Prinzip, ein Slice einem anderen zuzuweisen und dabei einfach die Referenz zu duplizieren und keine neue Kopie des zugrunde liegenden Arrays zu erstellen.
Daher mischt der Code sowohl arr als auch arr2 korrekt, da beide auf dasselbe zugrunde liegende Array verweisen Array von ganzen Zahlen.
Das obige ist der detaillierte Inhalt vonWarum wirkt sich das Mischen eines Slice auf ein anderes Slice aus, das auf dasselbe zugrunde liegende Array verweist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!