Prendre l'adresse des valeurs de la carte dans Go
Question :Pourquoi ne puis-je pas prendre l'adresse d'un valeur de la carte ?
Contexte :
Le langage de programmation Go restreint l'utilisation de l'opérateur "&" pour obtenir l'adresse des valeurs de la carte. Ce comportement est distinct des valeurs de tranche, qui peuvent être traitées à l'aide de "&".
Clarification des idées fausses :
Contrairement à la croyance selon laquelle les cartes sont soutenues par des structures de mémoire comme les tableaux, ils sont en fait stockés dans des structures de compartiments dynamiques et réorganisatrices. Cela signifie que les valeurs de la carte n'ont pas d'emplacement mémoire fixe.
La raison sous-jacente :
La principale raison pour laquelle Go interdit la prise d'adresse des valeurs de la carte est due à la nature dynamique des structures de données cartographiques. Au fur et à mesure que les entrées de carte sont créées, mises à jour ou supprimées, les compartiments peuvent être réorganisés pour optimiser les performances et l'utilisation de la mémoire. Si les adresses étaient autorisées pour les valeurs de carte, elles deviendraient invalides lors de ces déplacements.
Modifications numériques dans les cartes :
Bien que les opérateurs comme " " et " =" puissent être utilisé pour modifier les valeurs numériques de la carte sur place, ce formulaire abrégé effectue en fait une série d'opérations qui n'accèdent pas directement à la valeur sous-jacente.
Exemple :
func icandothis() { cmap := make(map[int]complex64) cmap[1] += complex(1, 0) fmt.Println(cmap[1]) }
L'expansion du formulaire abrégé révèle que l'opération crée en fait une nouvelle valeur temporaire pour effectuer l'ajout et la stocke dans la carte :
func icandothis() { cmap := make(map[int]complex64) v := cmap[1] v += complex(1, 0) cmap[1] = v fmt.Println(cmap[1]) }
Modification des valeurs de structure dans les cartes :
Contrairement aux valeurs numériques, la modification des valeurs de structure dans les cartes nécessite les étapes suivantes :
Exemple :
type Complex struct { R float32 I float32 } func (x *Complex) Add(c Complex) { x.R += c.R x.I += c.I } func main() { cmap := make(map[int]Complex) c := cmap[1] c.Add(Complex{1, 0}) cmap[1] = c fmt.Println(cmap[1]) }
En suivant ces étapes, la valeur de structure peut être modifiée dans -lieu sans exiger son adresse.
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!