Maison >développement back-end >Golang >Pourquoi le comportement de Slice Append change-t-il lors de la création de nouvelles tranches à partir d'une boucle ?

Pourquoi le comportement de Slice Append change-t-il lors de la création de nouvelles tranches à partir d'une boucle ?

DDD
DDDoriginal
2024-11-03 12:46:31605parcourir

Why Does Slice Append Behavior Change When Creating New Slices from a Loop?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn