Déréférencer un index de carte dans Go
Lors de la manipulation de valeurs dans une carte, il est important d'être conscient du comportement des récepteurs de pointeurs pour la carte entrées. Un piège courant survient lorsque l'on tente d'appeler des méthodes de récepteur de pointeur sur un index de carte, comme illustré par le code ci-dessous :
package main import "fmt" type item struct { itemName string amount int } type Cashier struct { items map[int]item cash int } func (i *item) GetAmount() int { return i.amount } func main() { x := Cashier{} x.AddItem("item1", 13) f := x.GetItems() fmt.Println(f[0].GetAmount()) // Error: cannot call pointer method on f[0] }
Dans ce code, la méthode GetAmount est définie comme un récepteur de pointeur pour manipuler directement l'élément. structurer. Cependant, lorsque vous appelez f[0].GetAmount(), vous recevez l’erreur « Impossible d’appeler la méthode du pointeur sur f[0] ». En effet, une entrée de carte ne peut pas être adressée directement en raison de changements potentiels dans son adresse à mesure que la carte s'agrandit ou se rétrécit.
La raison de ce comportement réside dans la manière dont Go implémente les cartes. Les cartes sont représentées en interne sous forme de tables de hachage qui peuvent être redimensionnées pendant l'exécution pour optimiser les performances. Par conséquent, l'adresse d'une entrée de carte peut changer au fil du temps, ce qui rend invalide sa transmission en tant qu'argument à une méthode de réception de pointeur.
Pour résoudre ce problème, une approche consiste à créer une copie de la carte. entrée au lieu d’utiliser un récepteur pointeur. Ceci peut être réalisé en récupérant d'abord la valeur de la carte à l'aide de l'index, puis en créant une copie de cette valeur :
func main() { x := Cashier{} x.AddItem("item1", 13) f := x.GetItems() itemCopy := f[0] fmt.Println(itemCopy.GetAmount()) // No error }
Dans ce cas, itemCopy est une copie de la valeur stockée dans f[0] , et il peut être utilisé pour appeler des méthodes de récepteur de pointeur sans rencontrer l'erreur.
En comprenant le comportement des récepteurs de pointeur avec des entrées de carte, les développeurs peuvent éviter cet écueil et écrire du code qui fonctionne correctement sur valeurs de la carte.
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!