"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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 ?

Publié le 2024-11-11
Parcourir:352

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 requête a été soulevée concernant la code suivant :

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)
    }
}

L'auteur a exprimé sa confusion quant à la raison pour laquelle arr2 était affecté par la fonction de lecture aléatoire, 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 sous-jacents. tableaux. Dans l'exemple de code fourni, aucun tableau n'est utilisé.

Slice Manipulation

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.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3