ProgrammationDéveloppeur Backend Go

Décrivez les particularités de la copie des tranches et des structures en Go. Comment éviter des effets inattendus lors de leur utilisation ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

Les structures en Go sont copiées par valeur (copie profonde du premier niveau, les structures imbriquées sont copiées selon la même règle), tandis que les tranches sont copiées par valeur, mais seule la structure est copiée, pas le tableau sous-jacent : à la fois l'original et la copie de la tranche pointent vers le même tableau de fond, donc une modification via une tranche se reflétera dans l'autre, à moins de faire une copie explicite du tableau via copy().

Exemple de copie de tranche :

s1 := []int{1,2,3} s2 := s1 // pointeurs vers le même tampon ! s2[0] = 99 fmt.Println(s1) // [99 2 3] // Pour copier le tableau : s3 := make([]int, len(s1)) copy(s3, s1) s3[0] = 42 fmt.Println(s1) // [99 2 3], s3 est indépendant

Lors de la copie des structures : si la structure contient un champ pointeur, un champ tranche, seules les références sont copiées, pas les valeurs.

Question piège

Quelle est la méthode pour "cloner" une tranche afin que ses modifications n'affectent pas l'original ?

Réponse potentiellement erronée : Il suffit de faire b := a. Correct :

  • Il faut utiliser copy, créer une nouvelle tranche de la longueur requise et copier les données :
newS := make([]int, len(a)) copy(newS, a)

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet


Histoire

Description : Lors de la génération de requêtes à la base de données, les champs de la tranche dans la structure de requête étaient modifiés de manière dynamique sans faire de copies. Lors de requêtes répétées, les données se chevauchaient, produisant des résultats incorrects pour les utilisateurs.


Histoire

Description : Lors du traitement parallèle des données, une copie de la structure était créée par assignation et la tranche était étendue dans une goroutine, tout en utilisant simultanément une autre tranche originale. Les données "se chevauchaient", entraînant des bugs imprévisibles.


Histoire

Description : Une structure tampon était utilisée, la copie simultanée par assignation ne tenait pas compte des tranches imbriquées (copie superficielle), les modifications à un endroit touchaient un autre tampon — en fin de compte, il était difficile de retracer l'origine des modifications des données.