Senior
Wenn ich mit einem Slice arbeite, es als Funktionsparameter nehme, etwas damit mache und nach der Funktion weiter damit arbeite — woran muss ich denken? Welche Änderungen werden von außen nicht sichtbar sein?
sobes.tech KI
Antwort von AI
In Go ist ein Slice eine Struktur, die einen Zeiger auf ein Array, eine Länge und eine Kapazität enthält. Wenn Sie ein Slice an eine Funktion übergeben, wird nur diese Struktur (Zeiger, Länge, Kapazität) kopiert, nicht das Array selbst.
Was wichtig ist zu beachten:
- Änderungen an den Elementen des Slices innerhalb der Funktion (z.B.
s[0] = 10) sind außerhalb sichtbar, da sie auf dasselbe Array zeigen. - Änderungen an der Slice-Struktur selbst (z.B. das Zuweisen eines neuen Slices
s = append(s, 5)) wirken sich nicht auf den Slice außerhalb der Funktion aus, da nur die Struktur kopiert wird.
Beispiel:
func modify(s []int) {
s[0] = 100 // ändert das Element des Arrays — außerhalb sichtbar
s = append(s, 200) // ändert die lokale Kopie des Slices — außerhalb nicht sichtbar
}
s := []int{1, 2, 3}
modify(s)
fmt.Println(s) // Gibt [100 2 3] aus, das Hinzufügen von 200 wird nicht reflektiert
Kurz gesagt, Änderungen an den Elementen des Slices sind außerhalb sichtbar, Änderungen an Länge oder Kapazität (durch append, slices) jedoch nicht, es sei denn, es wird ein neuer Slice zurückgegeben oder ein Zeiger auf den Slice übergeben.