Heim  >  Artikel  >  Backend-Entwicklung  >  Warum ändert das Ändern eines Arrays innerhalb einer Funktion in Go auch eine Variable, die demselben Array außerhalb der Funktion zugewiesen ist?

Warum ändert das Ändern eines Arrays innerhalb einer Funktion in Go auch eine Variable, die demselben Array außerhalb der Funktion zugewiesen ist?

Susan Sarandon
Susan SarandonOriginal
2024-10-26 01:25:28706Durchsuche

Why does modifying an array inside a function in Go also change a variable assigned to the same array outside the function?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn