Heim >Backend-Entwicklung >Golang >Warum führt die Indizierung einer vom Zeiger in Go übergebenen Karte zu Kompilierungsfehlern?
Übergabe von Karten nach Wert vs. Zeiger in Go
In Go kann die Übergabe nach Wert und Zeiger verwirrend sein, insbesondere beim Umgang mit Kartentypen. Dieser Artikel befasst sich mit dem Problem der Indizierung einer per Zeiger übergebenen Karte, was zu Kompilierungsfehlern führt.
Das Problem
Beim Versuch, eine Karte per Zeiger zu übergeben und zu ändern Bei Werten löst Go einen Fehler aus, dass der Typ die Indizierung nicht unterstützt. Dies liegt daran, dass die Indizierung auf einen Zeiger für Karten nicht unterstützt wird.
Die Lösung
Um diesen Fehler zu vermeiden, dereferenzieren Sie den Zeiger, bevor Sie die Karte indizieren. Verwenden Sie anstelle von b[amount.Currency] (*b)[amount.Currency].
Weitere Diskussion
Standardmäßig werden einfache Typen wie Ganzzahlen übergeben Wert, während Strukturen und Schnittstellen als Referenz übergeben werden. Dies gilt jedoch nicht für Karten. Karten werden standardmäßig als Referenz übergeben, sodass die Übergabe als Wert oder Zeiger im Wesentlichen dasselbe ist.
Im obigen Beispiel ist die Verwendung eines Zeigerempfängers für die Add-Methode nicht erforderlich, da die Karte bereits als Referenz übergeben wird. Die Methode könnte ohne Funktionsverlust wie folgt geschrieben werden:
func (b Balance) Add(amount Amount) Balance { current, ok := b[amount.Currency] if ok { b[amount.Currency] = current + amount.Value } else { b[amount.Currency] = amount.Value } return b }
Zusammenfassend lässt sich sagen, dass es bei der Arbeit mit Karten nicht notwendig ist, diese per Zeiger zu übergeben, um ein Kopieren zu vermeiden. Durch Wertübergabe wird das gleiche Ergebnis erzielt, ohne dass eine Dereferenzierung erforderlich ist.
Das obige ist der detaillierte Inhalt vonWarum führt die Indizierung einer vom Zeiger in Go übergebenen Karte zu Kompilierungsfehlern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!