Maison > développement back-end > Golang > Pourquoi les cartes et les tranches de Go se comportent-elles différemment lorsqu'elles sont transmises en tant que paramètres de fonction ?

Pourquoi les cartes et les tranches de Go se comportent-elles différemment lorsqu'elles sont transmises en tant que paramètres de fonction ?

Mary-Kate Olsen
Libérer: 2024-12-14 14:02:12
original
563 Les gens l'ont consulté

Why Do Go's Maps and Slices Behave Differently When Passed as Function Parameters?

Pourquoi Slice et Map se comportent différemment en tant que paramètres

Dans Go, les types de référence slice et map présentent un comportement contrasté lorsqu'ils sont transmis en tant que paramètres de fonction. Les cartes, étant des pointeurs vers des structures de données, reflètent toutes les modifications apportées à leurs éléments au sein de la fonction. Cependant, les nouveaux éléments ajoutés aux tranches, qui sont des structures qui stockent un pointeur de tableau, une longueur et une capacité, ne sont pas reflétés dans l'argument.

Cette différence provient de l'implémentation sous-jacente :

  • Cartes : Les cartes sont des pointeurs vers une structure de données, ce qui signifie que lorsqu'une carte est transmise à une fonction, elle fournit un pointeur vers la carte réelle. Toute modification apportée aux éléments de la carte est reflétée dans la carte d'origine, car le pointeur reste inchangé.
  • Slices : Les tranches, en revanche, sont des structures contenant un pointeur de tableau, une longueur et capacité. Lorsqu'une tranche est passée à une fonction, le compilateur crée une copie de l'en-tête de la tranche (c'est-à-dire la structure). Si des modifications sont apportées à la tranche, ces modifications n'affectent que la copie. La fonction ne connaît pas la tranche d'origine et tous les nouveaux éléments ajoutés à la tranche ne sont pas reflétés dans l'original.

Ce comportement est en outre influencé par la sémantique de passage par valeur de Go, où les copies des valeurs sont transmises aux fonctions. Les cartes, étant des pointeurs, sont toujours transmises par valeur, mais la copie pointe toujours vers la même structure de données sous-jacente. Cela permet aux modifications d'être reflétées dans l'original. Cependant, lorsqu'une tranche est transmise, une copie de l'en-tête de la tranche est effectuée et les modifications apportées à cette copie ne sont pas propagées à l'original.

Pour obtenir un comportement similaire pour les tranches, il faudrait transmettre des pointeurs aux tranches, ce qui en fait effectivement des pointeurs cachés. Cependant, cette pratique est rarement utilisée et l'approche la plus courante consiste à renvoyer une nouvelle tranche avec les modifications souhaitées.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal