Maison >développement back-end >Golang >Pourquoi l'ajout à une copie de tranche dans Go modifie-t-il parfois l'original ?
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 :
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!