Heim > Backend-Entwicklung > Golang > Können die Pointer-Receiver-Methoden von Go für Nicht-Pointer-Variablen aufgerufen werden?

Können die Pointer-Receiver-Methoden von Go für Nicht-Pointer-Variablen aufgerufen werden?

Barbara Streisand
Freigeben: 2024-11-27 21:49:16
Original
957 Leute haben es durchsucht

Can Go's Pointer Receiver Methods Be Called on Non-Pointer Variables?

Aufrufen von Methoden für den Zeigertyp *T mit Empfänger T

Die Programmiersprachenspezifikation Go besagt, dass der Methodensatz eines beliebigen Typs T besteht alle Methoden mit Empfängertyp T. Die Methodenmenge des entsprechenden Zeigertyps T ist jedoch die Menge aller Methoden mit Empfängertyp T oder T (einschließlich der Methodensatz von T).

Das bedeutet, dass wir Methoden mit einem Empfänger vom Typ *T für eine Variable vom Typ T aufrufen können, da der Compiler die Variable implizit dereferenziert, um die Methode aufzurufen.

Um dieses Konzept zu überprüfen, betrachten Sie den folgenden Code:

package main

import (
    "fmt"
    "reflect"
)

type User struct{}

func (self *User) SayWat() {
    fmt.Println(self)
    fmt.Println(reflect.TypeOf(self))
    fmt.Println("WAT\n")
}

func main() {
    var user User = User{}

    fmt.Println(reflect.TypeOf(user), "\n")

    user.SayWat()
}
Nach dem Login kopieren

Wenn wir diesen Code ausführen, stellen wir fest, dass die SayWat()-Methode für die Benutzervariable aufgerufen werden kann, obwohl Die Methode wird mit einem Zeigerempfänger definiert. Dies liegt daran, dass der Compiler die Variable automatisch für uns dereferenziert.

Es ist jedoch wichtig zu beachten, dass wir Methoden von *T auf T nicht direkt aufrufen können. Beispielsweise schlägt der folgende Code mit einem Compilerfehler fehl:

func main() {
    var user User = User{}

    (&user).SayWat()
}
Nach dem Login kopieren

In diesem Fall kann der Compiler die Variable nicht implizit dereferenzieren, da die SayWat()-Methode mit einem Zeigerempfänger definiert ist. Um die Methode aufzurufen, müssen wir die Variable explizit mit dem &-Operator dereferenzieren.

Obwohl wir daher Methoden mit einem Empfänger vom Typ T für eine Variable vom Typ T aufrufen können, können wir keine Methoden von aufrufen T auf T direkt.

Das obige ist der detaillierte Inhalt vonKönnen die Pointer-Receiver-Methoden von Go für Nicht-Pointer-Variablen aufgerufen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage