Heim >Backend-Entwicklung >Golang >Wie verarbeitet Go Methodenaufrufe mit Objektempfängern, wenn die Methode über einen Zeigerempfänger verfügt?
Methodenaufrufe mit Objekt- versus Zeigerempfängern
In Go können Methoden für Typen mit Wertempfängern (Nicht-Zeiger) oder Zeiger definiert werden Empfänger (Zeiger). Wenn Sie eine Methode mit einem Zeigerempfänger durch ein Objekt aufrufen, interpretiert Go den Aufruf automatisch so, als ob er über einen Zeiger auf das Objekt erfolgen würde.
Betrachten Sie beispielsweise den folgenden Code:
package main import ( "fmt" "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) // Calling a method with a pointer receiver using an object fmt.Println(v.Abs()) }
Hier haben wir einen Vertex-Typ mit sowohl Wert- als auch Zeigerempfängermethoden. In der Hauptfunktion erstellen wir ein Vertex-Objekt v und rufen dann die Scale-Methode dafür auf. Normalerweise erwartet die Scale-Methode einen Zeigerempfänger, aber in diesem Fall verwenden wir ein Objekt.
Der Compiler bemerkt, dass v adressierbar ist und dass sein Methodensatz Scale enthält. Gemäß der Go-Spezifikation:
„Ein Methodenaufruf x.m() ist gültig, wenn der Methodensatz von (dem Typ von) x m enthält und die Argumentliste der Parameterliste von m zugewiesen werden kann. Wenn x ist adressierbar und der Methodensatz von &x enthält m, x.m() ist eine Abkürzung für (&x).m().“
Daher wird der Aufruf v.Scale(10) interpretiert als (&v).Scale(10), das effektiv einen Zeiger auf das v-Objekt an die Scale-Methode übergibt. Dadurch kann die Methode die X- und Y-Felder des Objekts wie erwartet ändern.
Das obige ist der detaillierte Inhalt vonWie verarbeitet Go Methodenaufrufe mit Objektempfängern, wenn die Methode über einen Zeigerempfänger verfügt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!