Maison  >  Article  >  développement back-end  >  Pourquoi la modification d'un tableau à l'intérieur d'une fonction dans Go modifie-t-elle également une variable affectée au même tableau en dehors de la fonction ?

Pourquoi la modification d'un tableau à l'intérieur d'une fonction dans Go modifie-t-elle également une variable affectée au même tableau en dehors de la fonction ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 01:25:28706parcourir

Why does modifying an array inside a function in Go also change a variable assigned to the same array outside the function?

Traitement des tableaux en Go

En Go, les tableaux sont des valeurs, pas des références. Par conséquent, attribuer un tableau à un autre copiera tous les éléments. De plus, transmettre un tableau à une fonction fournira une copie, pas un pointeur.

Explication du code

Considérez l'exemple de 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)
    }
}

Dans ce code, la fonction shuffle prend un tableau comme entrée et mélange ses éléments. Cependant, même si nous attribuons le tableau d'origine à une nouvelle variable arr2 avant d'appeler shuffle, les modifications apportées à arr dans la fonction sont reflétées dans arr2.

Tranches vs tableaux

Go fait la distinction entre les tranches et les tableaux. Alors que les tableaux sont des listes de valeurs de longueur fixe, les tranches sont des références aux tableaux sous-jacents. Dans l’exemple de code, arr et arr2 font tous deux référence au même tableau sous-jacent. Par conséquent, toutes les modifications apportées à arr sont également appliquées à arr2. Pour créer une copie distincte d'un tableau, la tranche doit être allouée à l'aide de make :

arr := []int{1, 2, 3, 4, 5}
arr2 := make([]int, len(arr))
copy(arr2, arr)

Dans cette version mise à jour, arr2 n'est plus une référence au tableau d'origine, donc les modifications apportées à arr n'affecteront pas arr2.

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