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