Maison > développement back-end > Golang > Pourquoi Go lance-t-il « Opération invalide : tapez *map[key]value ne prend pas en charge l'indexation » ?

Pourquoi Go lance-t-il « Opération invalide : tapez *map[key]value ne prend pas en charge l'indexation » ?

DDD
Libérer: 2024-11-25 08:07:40
original
920 Les gens l'ont consulté

Why Does Go Throw

Go : opération invalide - Tapez *map[key]value ne prend pas en charge l'indexation

Arrière-plan :

Les mécanismes de pointeur de Go peuvent prêter à confusion, en particulier lorsque vous travaillez avec des cartes. Dans Go, une carte est un type de référence, ce qui signifie que lorsque vous transmettez une carte par valeur, vous transmettez une copie de la référence, et non la carte elle-même. Cependant, nous pouvons parfois avoir besoin de modifier la carte originale qui est passée à une fonction en tant qu'argument.

Problème :

Lorsque vous essayez de passer une carte par pointeur vers modifier son contenu, vous pouvez rencontrer l'erreur suivante :

prog.go:15: invalid operation: b[amount.Currency] (type *Balance does not support indexing)
Copier après la connexion

Cette erreur indique que vous tentez d'indexer un pointeur vers une carte, ce qui n'est pas le cas. pris en charge dans Go.

Solution :

Pour résoudre ce problème, vous devez faire la différence entre l'accès à la valeur de la carte et le pointeur vers celle-ci. Voici la bonne façon de procéder :

func (b *Balance) Add(amount Amount) *Balance {
    // Index the *b (pointer to map) to get the map itself
    current, ok := (*b)[amount.Currency]
    // Continue modifying the indexed map
    // ...
}
Copier après la connexion

En déréférençant le pointeur b à l'aide de *b, vous accédez à la carte elle-même et pouvez y effectuer les opérations nécessaires.

Approche alternative :

Si la carte est le seul champ de votre structure, comme c'est le cas dans cet exemple, vous pouvez éviter en le passant par pointeur. Au lieu de cela, transmettez-le par valeur comme indiqué dans le code suivant :

func Add(b Balance, amount Amount) Balance {
    // ... do your operations on the passed map ...
    return b
}
Copier après la connexion

Go transmet les cartes par référence par défaut, donc même si vous le transmettez par valeur, il est toujours traité comme une référence en interne, et toute modification créés dans la fonction sont reflétés dans la carte d'origine.

N'oubliez pas que lorsque vous travaillez avec des cartes, faites toujours la différence entre l'indexation de la carte elle-même et le pointeur vers celle-ci. Cela vous aidera à éviter des erreurs comme celle rencontrée dans ce cas.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal