Maison  >  Article  >  développement back-end  >  Pourquoi le mélange d'une tranche affecte-t-il une autre tranche faisant référence au même tableau sous-jacent ?

Pourquoi le mélange d'une tranche affecte-t-il une autre tranche faisant référence au même tableau sous-jacent ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 22:44:02251parcourir

Why Does Shuffling a Slice Affect Another Slice Referencing the Same Underlying Array?

Comprendre le traitement des tableaux dans Go

La documentation sur http://golang.org/doc/effective_go.html#arrays met en évidence la nature basée sur la valeur des tableaux dans Go, où l'attribution d'un tableau à un autre crée une copie de tous les éléments. Ce principe s'applique également aux arguments de fonction, où la fonction reçoit une copie du tableau, pas un pointeur.

Sur la base de ces informations, on pourrait s'attendre à ce que le code suivant aboutisse à des tableaux distincts pour arr2 et arr dans le Fonction main() :

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

Cependant, le code mélange également arr2 de manière inattendue. Ce comportement provient du fait que le code fourni fonctionne sur des tranches, pas sur des tableaux.

Slices : une référence aux tableaux

Go utilise les tranches comme un moyen plus flexible et plus efficace de gérer des séquences de valeurs. . Les tranches sont des références à des tableaux sous-jacents, et l'attribution d'une tranche à une autre duplique simplement la référence.

Dans l'exemple de code, la ligne arr := []int{1, 2, 3, 4, 5} crée un tranche qui fait référence à un tableau sous-jacent anonyme d’entiers. Lorsque arr2 := arr est exécuté, il crée une nouvelle tranche qui fait également référence au même tableau sous-jacent.

Implications pour le traitement du tableau

Puisque arr et arr2 font tous deux référence au même tableau sous-jacent, la modification de arr dans la fonction shuffle() affecte également arr2. Ce comportement s'aligne sur le principe d'assigner une tranche à une autre en dupliquant simplement la référence, sans créer de nouvelle copie du tableau sous-jacent.

Par conséquent, le code mélange correctement arr et arr2 car ils font tous deux référence au même sous-jacent. tableau d'entiers.

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