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