Heim > Backend-Entwicklung > Golang > Warum kann ich für einen Go-Map-Eintrag keine Zeigerempfängermethode aufrufen?

Warum kann ich für einen Go-Map-Eintrag keine Zeigerempfängermethode aufrufen?

Susan Sarandon
Freigeben: 2024-12-30 01:15:10
Original
487 Leute haben es durchsucht

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

Dereferenzieren eines Kartenindex in Golang

Beim Arbeiten mit Karten in Golang ist es wichtig, die Einschränkungen beim Referenzieren von Karteneinträgen zu verstehen. In einem aktuellen Programmierszenario tauchte eine Frage bezüglich des Fehlers auf: „Zeigermethode für f[0] kann nicht aufgerufen werden“.

Um das Problem zu klären, untersuchen wir den folgenden Code:

package main

import (
    "fmt"

    "inventory"
)

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

    fmt.Println(f[0].GetAmount())
}
Nach dem Login kopieren

Das Problem liegt im Typ der Karte und der aufgerufenen Methode. In der Driver.go-Datei wird die GetItems-Methode für die Cashier-Struktur aufgerufen, die eine Kopie der Artikelzuordnung zurückgibt. Allerdings handelt es sich bei der GetAmount-Methode um eine Zeigerempfängermethode, die die Verwendung der tatsächlichen Struktur erfordert.

In Go können Karteneinträge nicht direkt angesprochen werden, da sich ihre Adresse ändern kann, wenn die Karte größer oder kleiner wird. Daher können Sie keine Zeigerempfängermethoden für Karteneinträge aufrufen.

Um dieses Problem zu beheben, können Sie die GetItems-Methode ändern, um stattdessen einen Zeiger auf die Karte zurückzugeben:

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

By Dadurch stellen Sie sicher, dass die GetAmount-Methode direkt im Map-Eintrag aufgerufen werden kann. Hier ist die korrigierte Hauptfunktion:

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

Das obige ist der detaillierte Inhalt vonWarum kann ich für einen Go-Map-Eintrag keine Zeigerempfängermethode aufrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage