Maison >développement back-end >Golang >Pourquoi ne puis-je pas appeler une méthode de réception de pointeur sur une entrée Go Map ?

Pourquoi ne puis-je pas appeler une méthode de réception de pointeur sur une entrée Go Map ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-30 01:15:10494parcourir

Why Can't I Call a Pointer Receiver Method on a Go Map Entry?

Déréférencer un index de carte dans Golang

Lorsque vous travaillez avec des cartes dans Golang, il est important de comprendre les limites du référencement des entrées de carte. Dans un scénario de programmation récent, une question s'est posée concernant l'erreur : "cannot call pointer method on f[0]".

Pour clarifier le problème, examinons le code suivant :

package main

import (
    "fmt"

    "inventory"
)

func main() {
    x := inventory.Cashier{}
    x.AddItem("item1", 13)
    f := x.GetItems()

    fmt.Println(f[0].GetAmount())
}

Le problème réside dans le type de carte et la méthode appelée. Dans le fichier Driver.go, la méthode GetItems est appelée sur la structure Cashier, qui renvoie une copie de la carte des éléments. Cependant, la méthode GetAmount est une méthode de réception de pointeur, qui nécessite l'utilisation de la structure réelle.

Dans Go, les entrées de carte ne peuvent pas être adressées directement car leur adresse peut changer lorsque la carte s'agrandit ou se rétrécit. Par conséquent, vous ne pouvez pas appeler de méthodes de réception de pointeur sur les entrées de la carte.

Pour résoudre ce problème, vous pouvez modifier la méthode GetItems pour renvoyer un pointeur vers la carte à la place :

func (c *Cashier) GetItems() *map[int]item {
    return &c.items
}

Par ce faisant, vous vous assurez que la méthode GetAmount peut être appelée directement sur l’entrée de mappe. Voici la fonction principale corrigée :

func main() {
    x := inventory.Cashier{}
    x.AddItem("item1", 13)
    f := x.GetItems()
    fmt.Println((*f)[0].GetAmount())
}

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:
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