Heim > Artikel > Backend-Entwicklung > Wie ändern Slices in Golang das ursprüngliche Array, obwohl sie als Wert an Funktionen übergeben werden?
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!