Sobes.tech
Senior

Qu'est-ce qu'un slice ? Qu'est-ce qui se passe sous le capot d'un slice ? Comment fonctionne la fonction append ?

sobes.tech IA

Réponse de l'IA

En Go, un slice est un tableau dynamique qui représente une structure avec trois champs:

  • Pointeur vers le tableau (tableau sous-jacent en mémoire)
  • Longueur (len) — nombre d'éléments accessibles dans le slice
  • Capacité (cap) — nombre maximum d'éléments que le tableau sous-jacent peut contenir à partir du pointeur

En coulisses, un slice est une petite structure, à peu près comme ceci:

type sliceHeader struct {
    Data uintptr // pointeur vers le premier élément du tableau
    Len  int
    Cap  int
}

La fonction append ajoute des éléments au slice. Si la longueur du slice est inférieure à la capacité, append écrit simplement les nouveaux éléments dans le tableau sous-jacent et augmente la longueur. Si la longueur atteint la capacité, append alloue un nouveau tableau avec une capacité accrue (généralement le double), copie les anciens éléments, ajoute les nouveaux, et retourne un nouveau slice avec le pointeur mis à jour.

Exemple:

s := []int{1, 2, 3}
s = append(s, 4) // si cap(s) > len(s), ajoute simplement 4

// si cap(s) == len(s), alloue un nouveau tableau, copie [1,2,3], ajoute 4

Ainsi, append peut retourner un nouveau slice, et il est important d’assigner le résultat à nouveau.