go / intermediate
Snippet
Verständnis von Slice-Headern und gemeinsamen Backing-Arrays
In Go ist ein Slice ein Header, der einen Zeiger auf ein zugrundeliegendes Array (Backing-Array), eine Länge und eine Kapazität enthält. Das Slicen eines bestehenden Slices erstellt einen neuen Slice-Header, der auf dasselbe Backing-Array verweist. Das Ändern von Elementen des neuen Slices ändert direkt das Original-Slice. Das Hinzufügen (Append) innerhalb der Kapazität überschreibt Elemente im Backing-Array, während das Hinzufügen über die Kapazität hinaus die Allokation eines neuen Backing-Arrays auslöst.
snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package mainimport "fmt"func main() {original := []int{10, 20, 30, 40, 50}subSlice := original[1:4]fmt.Printf("len=%d cap=%d %v\n", len(subSlice), cap(subSlice), subSlice)subSlice[0] = 99fmt.Println("Original after modification:", original)subSlice = append(subSlice, 100)fmt.Println("Original after append:", original)}
Erklärung
1
original := []int{10, 20, 30, 40, 50}
Initialisiert ein Slice mit einer Länge von 5 und einer Kapazität von 5.
2
subSlice := original[1:4]
Erstellt ein Sub-Slice von Index 1 bis 3 (inklusive 1, exklusive 4). Die Länge ist 3, die Kapazit��t beträgt jedoch 4, da sie sich bis zum Ende des Backing-Arrays erstreckt.
3
subSlice[0] = 99
Modifiziert das erste Element von subSlice. Da es das Backing-Array teilt, ändert sich das zweite Element des Originals (Index 1) auf 99.
4
subSlice = append(subSlice, 100)
Hängt 100 an subSlice an. Da die Kapazität 4 beträgt, wird das vorhandene Backing-Array verwendet und das letzte Element des Originals (Index 4) mit 100 überschrieben.