Dans Go, l'ajout d'éléments à une tranche dans une boucle peut modifier de manière inattendue les valeurs des tranches existantes créées à partir du même tableau sous-jacent.
Le problème vient de la façon dont les tranches référencent les valeurs du tableau sous-jacent. Lorsque vous ajoutez à une tranche, cela peut modifier le tableau existant ou en créer un nouveau. Cependant, si la tranche a été créée à l'aide de la fonction make, elle fait toujours référence au même tableau sous-jacent.
Considérez le code suivant :
<code class="go">func create(iterations int) []int { a := make([]int, 0) for i := 0; i < iterations; i++ { a = append(a, i) } return a } func main() { sliceFromLoop() sliceFromLiteral() } func sliceFromLoop() { i := create(11) j := append(i, 100) g := append(i, 101) h := append(i, 102) fmt.Printf("i: %v\nj: %v\ng: %v\nh:%v\n", i, j, g, h) } func sliceFromLiteral() { i := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} j := append(i, 100) g := append(i, 101) h := append(i, 102) fmt.Printf("i: %v\nj: %v\ng: %v\nh:%v\n", i, j, g, h) }</code>
Dans le sliceFromLoop fonction, toutes les nouvelles tranches (j, g, h) partagent le même tableau sous-jacent que la tranche initiale i. Cela signifie que lorsque nous ajoutons à i, cela modifie le dernier élément de toutes les autres tranches.
Pour éviter ce comportement, il est recommandé de faire une copie de la tranche avant d'ajouter à cela. La fonction de copie alloue une nouvelle tranche avec les mêmes éléments que l'original.
<code class="go">func sliceFromLoopFixed() { i := create(11) j := append([]int{}, i..., 100) g := append([]int{}, i..., 101) h := append([]int{}, i..., 102) fmt.Printf("i: %v\nj: %v\ng: %v\nh:%v\n", i, j, g, h) }</code>
Dans ce cas, les nouvelles tranches j, g et h ont leurs propres tableaux sous-jacents, donc la valeur de i reste inchangée par les annexes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!