In der Tour of Go wird erwähnt, dass Zeiger verwendet werden, um Methoden auf Werte zu implementieren. Was passiert jedoch, wenn wir eine Methode mit einem Nicht-Zeiger-Empfänger deklarieren, aber versuchen, sie auf einen Zeigerwert zu verwenden, oder umgekehrt?
Die Antwort liegt in zwei Grundregeln der Go-Sprache:
Methodenableitung:
Go ermöglicht die Ableitung von Methoden aus vorhandenen Methoden. In Ihrem Beispiel wird die Methode func (v Vertex) Abs() float64 von der Methode func (v *Vertex) Abs() float64 abgeleitet. Dies bedeutet, dass beim Deklarieren der vorherigen Methode automatisch eine neue Implementierung generiert wird, die im Wesentlichen die ursprüngliche Methode mit einem Zeiger auf den Empfänger aufruft:
func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X+v.Y*v.Y) } func (v Vertex) Abs() float64 { return Vertex.Abs(*v) } // Automatically generated
Daher unabhängig davon, ob Sie func (v *) deklarieren Vertex) Abs() oder func (v Vertex) Abs(), in beiden Fällen wird die generierte Methode aufgerufen.
Automatische Adresse Annahme:
Go kann automatisch einen Zeiger auf eine Variable generieren. Im folgenden Fall wird der Ausdruck v.Abs() in den Code aufgelöst:
vp := &v vp.Abs()
Das bedeutet, dass, wenn Sie einen Wert an eine Methode übergeben, die einen Zeiger erwartet, und Go die Methode nicht automatisch von einem ableiten kann Wenn vorhanden, generiert der Compiler einen Zeiger auf den Wert und ruft dann die Methode für den Zeiger auf.
Zusammenfassend befolgt Go diese Regeln für die Verarbeitung von Zeigern und Methoden:
Das obige ist der detaillierte Inhalt vonWie geht Go mit Methoden und Zeigern um, wenn der Empfängertyp und der Werttyp nicht übereinstimmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!