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

Pourquoi la copie d'une Go Slice ne crée-t-elle pas de copie complète et comment puis-je éviter les mutations involontaires ?

Patricia Arquette
Libérer: 2024-11-27 18:38:14
original
499 Les gens l'ont consulté

Why Does Copying a Go Slice Not Create a Deep Copy, and How Can I Avoid Unintended Mutations?

Comprendre la mutabilité des tranches dans Go

Dans Go, une tranche est une variable de taille dynamique qui stocke une séquence contiguë d'éléments. Il est implémenté à l'aide d'une structure d'en-tête qui stocke la longueur et un pointeur vers le tableau sous-jacent contenant les éléments.

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

Dans ce code, la fonction append est utilisé pour modifier la tranche tempA. Cependant, lorsque la fonction someFunc revient, la tranche A d'origine est également modifiée, malgré le fait que tempA a été créé comme une copie de A.

Pourquoi cela se produit-il ?

Un en-tête de tranche est une structure de données distincte du tableau sous-jacent. Lorsqu'une tranche est copiée, seul l'en-tête est copié, pas le tableau sous-jacent. Cela signifie que la tranche A d'origine et la tranche tempA nouvellement créée pointent toutes deux vers le même tableau sous-jacent.

Lorsque la fonction append est appelée, une nouvelle tranche est créée et les éléments de la tranche tempA sont copiés dans le nouvelle tranche. Cependant, la tranche A pointe toujours vers le même tableau sous-jacent, qui contient désormais les éléments modifiés.

Recommandation

Pour éviter les mutations involontaires de la tranche d'origine lors de la modification d'un copie, vous devez utiliser la fonction de copie pour créer une copie complète de la tranche. La fonction de copie crée un nouveau tableau sous-jacent et y copie les éléments.

Voici un exemple d'utilisation de la fonction de copie :

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

Cela créera un nouveau tableau sous-jacent pour tempA et copiez-y les éléments de A. Toute modification apportée à tempA n’affectera pas la tranche A d’origine.

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