Maison >développement back-end >Golang >Pourquoi le fait de mélanger une tranche affecte-t-il une tranche qui lui est attribuée dans 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!