Heim  >  Artikel  >  Backend-Entwicklung  >  Wie ändern Slices in Golang das ursprüngliche Array, obwohl sie als Wert an Funktionen übergeben werden?

Wie ändern Slices in Golang das ursprüngliche Array, obwohl sie als Wert an Funktionen übergeben werden?

Linda Hamilton
Linda HamiltonOriginal
2024-10-30 12:34:15505Durchsuche

How do slices in Golang modify the original array even though they are passed to functions by value?

Arrays an Funktionen übergeben und in Golang ändern

In Programmiersprachen wie C werden Arrays implizit per Referenz übergeben, wenn sie an Funktionen übergeben werden. In Golang ist dieses Verhalten jedoch anders, was für diejenigen, die aus anderen Sprachen kommen, verwirrend sein kann.

Der Unterschied: Arrays vs. Slices

Im bereitgestellten Code Beispiel:

<code class="go">func main() {
    tab := []int{1, 2, 3}
    fmt.Println(tab)
    reverse(tab)
    fmt.Println(tab)
}

func reverse(tab []int) {
    for i, j := 0, len(tab)-1; i < j; i, j = i+1, j-1 {
        tab[i], tab[j] = tab[j], tab[i]
    }
}</code>

Es scheint, dass das Array als Wert (nicht als Referenz) übergeben wird, aber die Umkehrfunktion ändert immer noch das ursprüngliche Array. Der Schlüssel hier ist, dass „tab“ in Golang kein Array, sondern ein Slice ist.

Slices in Go

Slices sind leichtgewichtige Daten Strukturen, die einen zusammenhängenden Abschnitt eines Arrays darstellen. Sie bestehen aus einem Zeiger auf das zugrunde liegende Array, einer Länge und einer Kapazität. Wenn ein Slice an eine Funktion übergeben wird, werden nur die Header-Informationen (Zeiger, Länge, Kapazität) kopiert, nicht das gesamte zugrunde liegende Array.

Slices als Referenz übergeben

Daher wirken sich alle am Slice innerhalb der Funktion vorgenommenen Änderungen auf das zugrunde liegende Array aus, da sie auf dieselben Daten verweisen. Im obigen Beispiel ändert die Umkehrfunktion die Elemente des Slice, was sich wiederum auf die ursprüngliche Array-Registerkarte auswirkt.

Fazit

Während Arrays in Go übergeben werden Wert (Kopie), Slices werden als Referenz übergeben (unterliegende Daten teilen). Das Verständnis dieser Unterscheidung ist bei der Übergabe von Arrays oder Slices an Funktionen in Golang von entscheidender Bedeutung, um unerwartetes Verhalten zu vermeiden.

Das obige ist der detaillierte Inhalt vonWie ändern Slices in Golang das ursprüngliche Array, obwohl sie als Wert an Funktionen übergeben werden?. 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