Comportement inattendu d'ajout de tranche
Introduction au problème
Lors de l'ajout d'éléments à une tranche dans un boucle, les tentatives ultérieures de création de nouvelles tranches à partir du résultat en boucle présentent un comportement inattendu. Plus précisément, le dernier élément d’ajout écrase les résultats des ajouts précédents. Ce problème survient lors de la création de nouvelles tranches basées sur une tranche obtenue à partir d'une itération de boucle.
Analyse
Le comportement observé découle du fait que les tranches Go et les tableaux utilisent la même structure de données sous-jacente. Lors de l'ajout à une tranche, Go crée un nouvel objet tranche qui fait référence au même tableau sous-jacent. Cela signifie que toute modification apportée à la tranche d'origine affectera également les nouvelles tranches.
Solution
Pour éviter ce comportement, il est essentiel de copier la tranche avant de la réaliser toute modification. Cela crée un nouvel objet slice qui possède sa propre référence indépendante au tableau sous-jacent. La manière idiomatique d'y parvenir est d'utiliser la fonction de copie :
<code class="go">func makeFromSlice(sl []int) []int { result := make([]int, len(sl)) copy(result, sl) return result }</code>
En attribuant le résultat de makeFromSlice(i) à j dans la fonction principale, nous créons une nouvelle tranche indépendante de l'original i tranche. Cette nouvelle tranche peut être modifiée en toute sécurité sans affecter l'original.
Contraste avec les littéraux de tranche
Les littéraux de tranche, tels que {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, allouent toujours un nouveau tableau sous-jacent lorsqu'il est ajouté au-delà de sa capacité. Cela explique pourquoi sliceFromLiteral se comporte comme prévu.
Conclusion
Lorsque vous travaillez avec des tranches, n'oubliez pas de toujours en faire une copie avant de les modifier. Cela garantit que les modifications apportées aux nouvelles tranches n’affectent pas l’original. La fonction de copie fournit un moyen idiomatique et efficace de le faire.
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!