Sobes.tech
Senior

Was ist ein Slice? Was steckt unter der Haube eines Slices? Wie funktioniert die Funktion append?

sobes.tech KI

Antwort von AI

In Go ist ein Slice ein dynamisches Array, das eine Struktur mit drei Feldern darstellt:

  • Zeiger auf das Array (unterliegendes Array im Speicher)
  • Länge (len) — Anzahl der Elemente im Slice
  • Kapazität (cap) — maximale Anzahl der Elemente, die das unterliegende Array ab dem Zeiger aufnehmen kann

Im Hintergrund ist ein Slice eine kleine Struktur, ungefähr so:

type sliceHeader struct {
    Data uintptr // Zeiger auf das erste Element des Arrays
    Len  int
    Cap  int
}

Die Funktion append fügt Elemente zum Slice hinzu. Wenn die Länge des Slices kleiner als die Kapazität ist, schreibt append einfach die neuen Elemente in das unterliegende Array und erhöht die Länge. Wenn die Länge die Kapazität erreicht, weist append ein neues Array mit erhöhter Kapazität zu (normalerweise das Doppelte), kopiert die alten Elemente, fügt die neuen hinzu und gibt ein neues Slice mit aktualisiertem Zeiger zurück.

Beispiel:

s := []int{1, 2, 3}
s = append(s, 4) // wenn cap(s) > len(s), fügt einfach 4 hinzu

// wenn cap(s) == len(s), weist es ein neues Array zu, kopiert [1,2,3], fügt 4 hinzu

Auf diese Weise kann append ein neues Slice zurückgeben, und es ist wichtig, das Ergebnis erneut zuzuweisen.