Heim >Backend-Entwicklung >Golang >Wie verarbeitet Go Methodenaufrufe mit Objektempfängern, wenn die Methode über einen Zeigerempfänger verfügt?

Wie verarbeitet Go Methodenaufrufe mit Objektempfängern, wenn die Methode über einen Zeigerempfänger verfügt?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-23 18:47:12449Durchsuche

How Does Go Handle Method Calls with Object Receivers When the Method Has a Pointer Receiver?

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!

Stellungnahme:
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