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.
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 :
copy, créer une nouvelle tranche de la longueur requise et copier les données :newS := make([]int, len(a)) copy(newS, a)
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.