Go-Methoden für Zeigertypen: Methoden mit Empfänger T für Zeigertyp *T aufrufen
Frage:
Die Go-Spezifikation besagt, dass der Methodensatz eines Zeigertyps T den Methodensatz seines entsprechenden Typs T enthält. Bedeutet das, dass wir Methoden mit Empfänger T für Variablen vom Typ T aufrufen können?
Antwort:
Obwohl die Spezifikation dies vorschlägt, ist es wichtig zu beachten, dass Sie Methoden von *T auf T nicht direkt aufrufen können. Stattdessen dereferenziert der Compiler die Variable zu &T und ruft die Methode auf, wodurch effektiv (&T).m() ausgeführt wird.
Dieses Verhalten ist explizit in der Go-Spezifikation definiert:
"Aufrufe: 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 adressierbar ist und der Methodensatz von &x m enthält, ist x.m() die Abkürzung für (&x).m (). "
Demonstration:
Das folgende Beispiel veranschaulicht dieses Verhalten:
package main import ( "fmt" "reflect" ) type User struct{} func (this *User) SayWat() { fmt.Println(reflect.TypeOf(this)) fmt.Println("WAT\n") } func main() { var user = User{} fmt.Println(reflect.TypeOf(user)) user.SayWat() }
Trotz der Deklaration der SayWat-Methode mit einem Empfänger von * Benutzer, wir können es für den Benutzer aufrufen, der vom Typ Benutzer ist. Der Compiler übernimmt automatisch die Dereferenzierung und ruft (&user).SayWat() auf.
Ausnahme:
Dies gilt jedoch nur für adressierbare Variablen. Wenn Sie versuchen, eine Zeigermethode für einen nicht adressierbaren Wert aufzurufen, tritt ein Fehler auf. Zum Beispiel:
func aUser() User { return User{} } ... aUser().SayWat() // Error: cannot call pointer method on aUser()
Das obige ist der detaillierte Inhalt vonKönnen Go-Methoden mit Empfängertyp „T' für Variablen vom Typ „*T' aufgerufen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!