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)
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 // ... }
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 }
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!