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
Libérer: 2024-12-30 01:15:10
original
504 Les gens l'ont consulté

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

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

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

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