Heim >Backend-Entwicklung >Golang >Warum kann ich eine Go-Methode mit einem Zeigerempfänger aufrufen, indem ich ein Objekt anstelle eines Zeigers verwende?
Aufrufen einer für Zeiger vorgesehenen Methode mit einem Objekt
In Go ist es möglich, eine für einen Zeigerempfänger vorgesehene Methode mit einem aufzurufen Objekt anstelle eines Zeigers darauf. Dies mag ungewöhnlich erscheinen, ist aber gemäß der Go-Spezifikation zulässig.
Betrachten Sie den folgenden Code:
package main import "math" type Vertex struct { X, Y float64 } func (v Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } func (v *Vertex) Scale(f float64) { v.X = v.X * f v.Y = v.Y * f } func main() { v := Vertex{3, 4} v.Scale(10) // v is not a pointer to a Vertex object fmt.Println(v.Abs()) }
In diesem Beispiel ist v ein Objekt vom Typ Vertex und Scale ist es eine Methode, die für einen Zeiger auf Vertex gedacht ist. Anstatt jedoch einen Zeiger auf v zu übergeben, rufen wir v.Scale(10) direkt auf.
Warum ist das kein Fehler? Die Antwort liegt in einer Regel, die in der Go-Spezifikation für Methodenaufrufe definiert ist:
If x is addressable and &x's method set contains m, x.m() is shorthand for (&x).m().
Diese Regel besagt, dass, wenn der aufgerufene Wert adressierbar ist (d. h. es ist eine lokale Variable oder ein Zeiger), der Aufruf erfolgt Eine Methode darauf entspricht dem Aufruf der Methode an ihrer Adresse. In diesem Fall ist v eine lokale Variable, daher wird v.Scale(10) so interpretiert, als hätten wir stattdessen (&v).Scale(10) geschrieben.
Diese Bequemlichkeit ermöglicht es uns, sauberer und prägnanter zu schreiben Code, ohne dass vor dem Aufruf der Methode explizit ein Zeiger auf das Objekt erstellt werden muss. Es ist jedoch wichtig zu beachten, dass dies nur für Methoden mit Zeigerempfängern funktioniert. Bei Methoden mit Wertempfängern ist die Übergabe eines Zeigers auf das Objekt nicht zulässig.
Das obige ist der detaillierte Inhalt vonWarum kann ich eine Go-Methode mit einem Zeigerempfänger aufrufen, indem ich ein Objekt anstelle eines Zeigers verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!