Sobes.tech
Middle

Wie sehr wächst die Größe des Slices bei Verwendung der Funktion append?

sobes.tech KI

Antwort von AI

Die Größe des Slices kann je nach aktueller Kapazität cap(slice) unterschiedlich wachsen:

  1. Wenn die Kapazität nicht ausreicht: Die neue Kapazität ist mindestens doppelt so groß wie die aktuelle, wenn diese kleiner als 1024 ist. Wenn sie größer als 1024 ist, erhöht sich die Kapazität um etwa 25 % der aktuellen Kapazität, bis sie ausreichend ist. Danach kann sie nach oben angepasst werden.
  2. Wenn die Kapazität ausreicht: Die Größe des Slices erhöht sich genau um die Anzahl der hinzugefügten Elemente, und die Kapazität bleibt unverändert.
// Beispiel für das Verhalten von append bei unzureichender Kapazität
s := make([]int, 0, 0) // Größe 0, Kapazität 0
s = append(s, 1)       // Größe 1, Kapazität 1. (0 -> 1)
s = append(s, 2)       // Größe 2, Kapazität 2. (1 -> 2)
s = append(s, 3)       // Größe 3, Kapazität 4. (2 -> 4)
s = append(s, 4)       // Größe 4, Kapazität 4
s = append(s, 5)       // Größe 5, Kapazität 8. (4 -> 8)

s2 := make([]int, 0, 1025) // Größe 0, Kapazität 1025
s2 = append(s2, make([]int, 500)...) // Größe 500, Kapazität 1025 (ausreichend)
s2 = append(s2, make([]int, 1000)...) // Größe 1500, Kapazität ungefähr 1025 + 1025*0.25 + epsilon

Der konkrete Algorithmus für das Wachstum der Kapazität befindet sich im runtime und kann zwischen Go-Versionen variieren. Die allgemeinen Regeln (Verdopplung bis 1024, Erhöhung um ca. 25 % danach) bleiben jedoch bestehen.