Maison  >  Article  >  développement back-end  >  Comment les tranches de Golang modifient-elles le tableau d'origine même si elles sont transmises aux fonctions par valeur ?

Comment les tranches de Golang modifient-elles le tableau d'origine même si elles sont transmises aux fonctions par valeur ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-30 12:34:15503parcourir

How do slices in Golang modify the original array even though they are passed to functions by value?

Passer des tableaux aux fonctions et les modifier dans Golang

Dans les langages de programmation comme C , les tableaux sont implicitement passés par référence lorsqu'ils sont transmis aux fonctions. Cependant, en Golang, ce comportement est différent, ce qui peut prêter à confusion pour ceux venant d'autres langues.

La différence : tableaux vs tranches

Dans le code fourni exemple :

<code class="go">func main() {
    tab := []int{1, 2, 3}
    fmt.Println(tab)
    reverse(tab)
    fmt.Println(tab)
}

func reverse(tab []int) {
    for i, j := 0, len(tab)-1; i < j; i, j = i+1, j-1 {
        tab[i], tab[j] = tab[j], tab[i]
    }
}</code>

Il semble que le tableau soit passé par valeur (pas par référence), mais la fonction inverse modifie toujours le tableau d'origine. La clé ici est qu'en Golang, "tab" n'est pas un tableau mais une slice.

Les tranches dans Go

Les tranches sont des données légères structures qui représentent une section contiguë d’un tableau. Ils consistent en un pointeur vers le tableau sous-jacent, une longueur et une capacité. Lorsqu'une tranche est transmise à une fonction, seules les informations d'en-tête (pointeur, longueur, capacité) sont copiées, et non l'intégralité du tableau sous-jacent.

Passer des tranches par référence

Par conséquent, toute modification apportée à la tranche dans la fonction affecte le tableau sous-jacent, car elle pointe vers les mêmes données. Dans l'exemple ci-dessus, la fonction reverse modifie les éléments de la tranche, ce qui à son tour affecte l'onglet du tableau d'origine.

Conclusion

Alors que les tableaux dans Go sont passés par valeur (copie), les tranches sont passées par référence (partager les données sous-jacentes). Comprendre cette distinction est crucial lors de la transmission de tableaux ou de tranches aux fonctions dans Golang pour éviter un comportement inattendu.

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