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
DDDoriginal
2024-12-01 12:15:13397parcourir

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:]...)
}

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)

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