0 Tage Serie
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 main
import "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] = 99
fmt.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.