Maison > développement back-end > Golang > le corps du texte

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

DDD
Libérer: 2024-11-03 12:46:31
original
557 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal