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

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

Susan Sarandon
Libérer: 2024-12-29 13:01:11
original
594 Les gens l'ont consulté

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

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

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

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!

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