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

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

Susan Sarandon
Freigeben: 2024-12-29 13:01:11
Original
593 Leute haben es durchsucht

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

Dereferenzieren eines Kartenindex in Go

Beim Bearbeiten von Werten in einer Karte ist es wichtig, das Verhalten von Zeigerempfängern für die Karte zu kennen Einträge. Eine häufige Gefahr entsteht beim Versuch, Zeigerempfängermethoden für einen Kartenindex aufzurufen, wie im folgenden Code veranschaulicht:

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]
}
Nach dem Login kopieren

In diesem Code ist die GetAmount-Methode als Zeigerempfänger definiert, um das Element direkt zu manipulieren Struktur. Wenn Sie jedoch f[0].GetAmount() aufrufen, erhalten Sie die Fehlermeldung „Zeigermethode für f[0] kann nicht aufgerufen werden“. Dies liegt daran, dass ein Karteneintrag nicht direkt angesprochen werden kann, da sich seine Adresse möglicherweise ändert, wenn die Karte wächst oder schrumpft.

Der Grund für dieses Verhalten liegt in der Art und Weise, wie Go Karten implementiert. Karten werden intern als Hash-Tabellen dargestellt, deren Größe während der Laufzeit geändert werden kann, um die Leistung zu optimieren. Infolgedessen kann sich die Adresse eines Karteneintrags im Laufe der Zeit ändern, sodass die Übergabe als Argument an eine Zeigerempfängermethode ungültig wird.

Um dieses Problem zu beheben, besteht ein Ansatz darin, eine Kopie der Karte zu erstellen Eingabe anstelle der Verwendung eines Zeigerempfängers. Dies kann erreicht werden, indem zuerst der Wert mithilfe des Index aus der Karte abgerufen und dann eine Kopie dieses Werts erstellt wird:

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

    itemCopy := f[0]
    fmt.Println(itemCopy.GetAmount()) // No error
}
Nach dem Login kopieren

In diesem Fall ist itemCopy eine Kopie des bei f[0] gespeicherten Werts. , und es kann verwendet werden, um Zeigerempfängermethoden aufzurufen, ohne dass der Fehler auftritt.

Durch das Verständnis des Verhaltens von Zeigerempfängern mit Karteneinträgen können Entwickler diese Falle vermeiden und Code schreiben, der korrekt funktioniert Kartenwerte.

Das obige ist der detaillierte Inhalt vonWarum kann ich keine Zeigerempfängermethode für einen Go-Map-Index 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