Maison >développement back-end >Golang >Go Slices vs Maps : pourquoi les ajouts se comportent-ils différemment ?
Slice vs Map : comprendre le comportement de référence des paramètres
Dans Go, les tranches et les cartes représentent toutes deux des types de référence. Lors de la modification d'un élément dans l'un ou l'autre type, la modification se reflète dans toutes les tranches/cartes qui en dérivent. Ce comportement de modification partagé résulte de l'implémentation de cartes basée sur un pointeur, où les modifications apportées via un pointeur s'appliquent à la carte d'origine.
Cependant, lors de l'ajout de nouveaux éléments, les tranches et les cartes se comportent différemment. Dans l'exemple de code fourni, l'ajout de nouveaux éléments à une carte (editMap) rend ces éléments accessibles via la carte d'origine. Cependant, l'ajout à une tranche (editSlice) n'a aucun effet sur la tranche d'origine.
Cette différence provient des différences sous-jacentes d'implémentation entre les tranches et les cartes. Les cartes sont implémentées sous forme de pointeurs vers des structures de cartes de hachage, tandis que les tranches sont des structures légères qui font référence à un tableau. Lors de l'ajout d'un nouvel élément à une carte, le pointeur reste constant, ce qui entraîne la visibilité du nouvel élément dans toutes les cartes dérivées.
À l'inverse, lors de l'ajout à une tranche, l'en-tête de la tranche (décrivant la longueur de la tranche, capacité et pointeur de tableau) doivent être modifiés. Cependant, puisque Go transmet les variables par valeur, toutes les modifications apportées à la copie de l'en-tête de la tranche (dans le paramètre transmis) ne sont pas reflétées dans la tranche d'origine.
Pour obtenir un comportement cohérent entre les tranches et les cartes, on pourrait implémenter des tranches comme des pointeurs, semblables aux cartes. Cela garantirait que les modifications apportées via des pointeurs vers des tranches modifient également la tranche d'origine. Cependant, cette approche est rare dans Go en raison du manque de prise en charge linguistique pour passer et travailler avec des pointeurs de tranche. Au lieu de cela, la convention consistant à renvoyer de nouvelles tranches après modification est largement adoptée.
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!