Maison  >  Article  >  développement back-end  >  Pourquoi le fait de mélanger une tranche affecte-t-il une tranche qui lui est attribuée dans Go ?

Pourquoi le fait de mélanger une tranche affecte-t-il une tranche qui lui est attribuée dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-27 03:57:03987parcourir

Why does shuffling a slice affect a slice assigned to it in Go?

Gestion des tableaux dans Go

Dans Go, les tableaux sont des types de valeur, et l'attribution d'un tableau à un autre crée une copie de tous ses éléments. Cela est vrai même lors du passage d'un tableau à une fonction, car il recevra une copie plutôt qu'une référence mémoire.

Question originale

Une question a été soulevée concernant le code suivant :

<code class="go">package main

import (
    "fmt"
    "rand"
    "time"
)

func shuffle(arr []int) {
    rand.Seed(time.Nanoseconds())
    for i := len(arr) - 1; i > 0; i-- {
        j := rand.Intn(i)
        arr[i], arr[j] = arr[j], arr[i]
    }
}

func main() {
    arr := []int{1, 2, 3, 4, 5}
    arr2 := arr
    shuffle(arr)
    for _, i := range arr2 {
        fmt.Printf("%d ", i)
    }
}</code>

L'auteur a exprimé sa confusion quant à la raison pour laquelle arr2 était affecté par la fonction shuffle, bien qu'il s'attende à ce que arr2 et arr soient des entités distinctes.

Clarification

Le problème vient d'un malentendu entre les tableaux et les tranches.

Arrays vs Slices

Les tableaux sont des collections de valeurs de longueur fixe, tandis que les tranches sont des références dynamiques aux tableaux sous-jacents. Dans l'exemple de code fourni, aucun tableau n'est utilisé.

Manipulation de tranche

La ligne arr := []int{1, 2, 3, 4, 5} crée une tranche faisant référence à un tableau sous-jacent anonyme. La ligne arr2 := arr suivante duplique simplement cette référence, ce qui fait que arr et arr2 pointent tous deux vers le même tableau sous-jacent.

Comportement de la fonction

Lors du passage de arr au fonction shuffle, une copie de la tranche est créée, pas le tableau sous-jacent. Cette copie est modifiée par la fonction, c'est pourquoi arr2 est également affecté lorsque arr est modifié.

Conclusion

Dans Go, les tranches se comportent comme des références aux tableaux sous-jacents. L'attribution d'une tranche à une autre copie la référence, pas le tableau sous-jacent. Ce concept est crucial pour comprendre la manipulation des tranches dans Go.

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