Maison > développement back-end > Golang > Pourquoi la modification d'une copie Go Slice modifie-t-elle également l'original ?

Pourquoi la modification d'une copie Go Slice modifie-t-elle également l'original ?

Barbara Streisand
Libérer: 2024-11-19 06:44:02
original
267 Les gens l'ont consulté

Why Does Modifying a Go Slice Copy Also Change the Original?

Comprendre la modification de tranche dans Go

Dans Go, les variables de tranche se comportent différemment des tableaux typiques. Cela peut entraîner un comportement inattendu, en particulier lors de la modification de tranches.

Le mystère de la tranche originale changeante

Considérez le code suivant :

import "fmt"

func main() {
    A := []int{3, 4, 5, 3, 7}

    fmt.Println("Initial slice: ", A)
    funcSome(A)
    fmt.Println("Modified slice: ", A)
}

func funcSome(slice []int) {
    fmt.Println("Inside function, original slice: ", slice)
    temp := slice // copy by value

    temp[0] = 10
    fmt.Println("Inside function, modified temp: ", temp)
    fmt.Println("Inside function, original slice: ", slice)
}
Copier après la connexion

Lorsque vous exécutez ce code, vous pourriez être surpris de constater que la modification de la tranche temporaire, temp, modifie également la tranche d'origine, A.

Plongez dans les éléments internes de la tranche

Pour comprendre ce comportement, nous devons nous plonger dans la structure interne des tranches. Une variable de tranche se compose de trois composants :

  • Pointeur : pointe vers le tableau de sauvegarde qui contient les données
  • Longueur : nombre d'éléments dans la tranche
  • Capacité : Capacité maximale de la tranche

Lorsque vous attribuez une tranche à une nouvelle variable par valeur, comme nous le faisons avec temp := slice, vous créez une copie superficielle. Cela signifie que la nouvelle tranche (temp) partage le même tableau de support et le même pointeur que la tranche d'origine (slice).

Le dilemme append()

L'append( ) dans Go ajoute des éléments à une tranche en créant un nouveau tableau de sauvegarde et en y copiant les données existantes. Cependant, si la nouvelle tranche a une capacité insuffisante, la fonction append() augmentera automatiquement la capacité en réattribuant un tableau de sauvegarde plus grand.

Dans votre exemple, la fonction remove() utilise append() pour créer une nouvelle tranche. tranche. Étant donné que temp et A partagent le même tableau de support, toute modification apportée à la nouvelle tranche affectera également la tranche d'origine.

Conclusion

Comprendre la modification de tranche dans Go nécessite une familiarité avec sa structure interne unique. N'oubliez pas que lorsque vous copiez des tranches par valeur, vous créez une copie superficielle, qui partage le même tableau de sauvegarde. Ce comportement peut entraîner des conséquences inattendues lors de la modification des tranches.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal