Maison > développement back-end > Golang > Pourquoi ne puis-je pas prendre l'adresse d'une valeur de carte dans Go ?

Pourquoi ne puis-je pas prendre l'adresse d'une valeur de carte dans Go ?

Linda Hamilton
Libérer: 2024-11-16 07:24:02
original
555 Les gens l'ont consulté

Why can't I take the address of a map value in Go?

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])
}
Copier après la connexion

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])
}
Copier après la connexion

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 :

  1. Récupérer la valeur de structure de la carte.
  2. Modifier la valeur de structure.
  3. Stockez la valeur de structure modifiée dans la carte.

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])
}
Copier après la connexion

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!

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