Slice
Ein Slice ist ein Datentyp, welcher sich ähnlich verhält wie ein Array. Der Slice bietet aber zusätzliche Funktionen an, welche den Umgang mit Datensequenzen erleichtern. Ein Slice keine fixe Länge und er kann nur Elemente von einem Typ aufnehmen. Das nachfolgende Beispiel zeigt zwei Arten wie man ein Slice erzeugt.
// Slice Literal
letters := []string{"a", "b", "c", "d"}
// make-Funktion
var s []byte
s = make([]byte, 5)
// s == []byte{0, 0, 0, 0, 0}
Mit den Funktionen len(s)
bzw. cap(s)
kann die Länge bzw. die Kapazität eines Slice abgefragt werden. Die Länge liefert wie erwartet die Anzahl Elemente im Slice zurück. Die Kapazität ist die maximale Anzahl Elemente die der Slice aufnehmen kann. Mehr Elemente als die Kapazität kann ein Slice nicht aufnehmen. Mit der Funktion append()
wird intern automatisch ein neues Array alloziert und die Kapazität erhöht. Das nachfolgende Beispiel zeigt diese Erweiterung.
var s []byte
s = make([]byte, 5)
// len: 5 cap: 5
s = append(s, 3)
// len: 6 cap: 16 <- automatisch erweitert
Wird ein Slice an eine Methode übergeben geschieht dies per copy by value. Intern verwendet der Slice aber einen Pointer auf dasselbe Array. Es wird also nur der Slice-Header als Kopie übergeben aber die Werte werden nicht kopiert. Das nachfolgende Beispiel zeigt dieses Verhalten.
func AddOneToEachElement(slice []byte) {
for i := range slice {
slice[i]++
}
}
func main() {
s = make([]byte, 10)
for i := 0; i < len(s); i++ {
s[i] = byte(i)
}
// before [0 1 2 3 4 5 6 7 8 9]
AddOneToEachElement(slice)
//after [1 2 3 4 5 6 7 8 9 10]
}
Ein Slice ist ein eigenständiger Typ (wie auch z.B. Array oder Struct) welcher einen Ausschnitt aus einem Array beschreibt. Die Performance von Slices ist meist besser, weil beim Herumreichen eines Slice nicht alle Daten kopiert werden müssen, wie bei einem Array.
Gerrand, Andrew (2011), Go Slices: usage and internals, Gefunden unter: http://blog.golang.org/go-slices-usage-and-internals
Pike, Rob (2013), Arrays, slices (and strings): The mechanics of 'append', Gefunden unter: https://blog.golang.org/slices