Maison > développement back-end > Golang > Pourquoi l'ajout à une copie de tranche dans Go modifie-t-il parfois l'original ?

Pourquoi l'ajout à une copie de tranche dans Go modifie-t-il parfois l'original ?

DDD
Libérer: 2024-12-01 12:15:13
original
476 Les gens l'ont consulté

Why Does Appending to a Slice Copy in Go Sometimes Modify the Original?

Pourquoi les ajouts de tranches modifient-ils la tranche d'origine dans Go ?

Dans Go, la fonction d'ajout intégrée ajoute des éléments à une tranche en créant un nouveau tableau sous-jacent, copier les éléments existants et ajouter les nouveaux éléments. Si la tranche d'origine et la tranche utilisée dans la fonction append partagent le même tableau sous-jacent, les modifications apportées à l'une ou l'autre tranche seront reflétées dans les deux.

Considérez l'extrait de code suivant :

func someFunc(A []int) int {
    ...
    tempA := A // copy the slice by value
    ...
    newArr = remove(tempA, i)
    ...
}

func remove(slice []int, s int) []int {
    return append(slice[:s], slice[s+1:]...)
}
Copier après la connexion

Ici, la fonction someFunc prend une tranche A et en crée une copie appelée tempA. La fonction Remove exécute ensuite la fonction append sur tempA pour supprimer l'élément à l'index s.

Comme la tranche tempA fait référence à l'origine au même tableau sous-jacent que A, les modifications apportées à tempA (via la fonction append) sont également reflété dans A. En effet, la fonction append crée un nouveau tableau sous-jacent et y copie les éléments existants. Comme A et tempA partagent le même tableau sous-jacent, toutes les modifications apportées à l'un sont également propagées à l'autre.

Ce comportement est attendu dans Go en raison de la façon dont les tranches sont implémentées en interne :

  • Les tranches sont des objets d'en-tête qui décrivent une section d'un tableau sous-jacent.
  • Lors de la copie d'une tranche, l'en-tête est copié, mais le tableau sous-jacent est pas.
  • Si deux tranches partagent le même en-tête, elles font référence au même tableau sous-jacent et les modifications apportées à une tranche affectent l'autre.

Pour éviter ce comportement de référence partagée, vous pouvez créez une nouvelle tranche et copiez les éléments explicitement comme suit :

tempA := make([]int, len(A))
copy(tempA, A)
Copier après la connexion

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 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