Heim >Backend-Entwicklung >Golang >Können die Pointer-Receiver-Methoden von Go für Nicht-Pointer-Variablen aufgerufen werden?
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() }
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() }
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!