Slice vs Map: Comprendre le comportement de référence du paramètre
Dans Go, Slices and Maps Représentant les deux types de référence. Lors de la modification d'un élément dans l'un ou l'autre type, le changement se reflète dans toutes les tranches / cartes dérivées d'eux. Ce comportement de modification partagé résulte de l'implémentation basée sur le pointeur de cartes, où les modifications apportées à un pointeur s'appliquent à la carte d'origine.
Cependant, lors de l'ajout de nouveaux éléments, tranches et cartes se comportent différemment. Dans l'exemple de code fourni, l'ajout de nouveaux éléments sur une carte (Editmap) entraîne les éléments accessibles via la carte d'origine. Cependant, ajouter une tranche (editSlice) n'a aucun effet sur la tranche d'origine.
Cette divergence découle des différences d'implémentation sous-jacentes entre les tranches et les cartes. Les cartes sont implémentées sous forme de pointeurs vers les 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, conduisant à la visibilité du nouvel élément dans toutes les cartes dérivées.
Contrairement, lors de l'apprentissage d'une tranche, l'en-tête de tranche (décrivant la longueur, la capacité et le pointeur du tableau de la tranche) 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 tranche (dans le paramètre passé) 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, similaires aux cartes. Cela garantirait que les modifications apportées à des pointeurs vers les tranches modifient également la tranche d'origine. Cependant, cette approche est rare dans GO en raison du manque de soutien linguistique pour passer et travailler avec des pointeurs de tranche. Au lieu de cela, la convention de retour de nouvelles tranches après modification est largement adoptée.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3