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
Susan Sarandonoriginal
2024-12-29 13:01:11620parcourir

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

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!

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