Sobes.tech
Senior

Si je travaille avec une tranche, que je la prends comme paramètre de fonction, que je fais quelque chose avec, puis que je continue à travailler avec elle après la fonction — à quoi faut-il faire attention ? Quels changements ne seront pas visibles de l'extérieur ?

sobes.tech IA

Réponse de l'IA

En Go, une tranche (slice) est une structure contenant un pointeur vers un tableau, une longueur et une capacité. Lorsque vous passez une tranche à une fonction, seule cette structure (pointeur, longueur, capacité) est copiée, pas le tableau lui-même.

Ce qu'il faut retenir :

  • Les modifications des éléments de la tranche à l'intérieur de la fonction (par exemple, s[0] = 10) seront visibles à l'extérieur, car elles pointent vers le même tableau.
  • Les modifications de la structure de la tranche elle-même (par exemple, l'assignation d'une nouvelle tranche s = append(s, 5)) n'affecteront pas la tranche en dehors de la fonction, car seule la structure est copiée.

Exemple :

func modify(s []int) {
    s[0] = 100       // modifiera l'élément du tableau — visible à l'extérieur
    s = append(s, 200) // modifie la copie locale de la tranche — pas visible à l'extérieur
}

s := []int{1, 2, 3}
modify(s)
fmt.Println(s) // Affichera [100 2 3], l'ajout de 200 ne sera pas reflété

En résumé, les modifications des éléments de la tranche sont visibles à l'extérieur, mais les modifications de la longueur ou de la capacité (via append, slices) ne le sont pas, sauf si vous renvoyez une nouvelle tranche ou passez un pointeur à la tranche.