Go-Methoden für Zeigertypen: Aufrufen von Methoden mit Receiver T für Zeigertyp *T
Frage:
Die Go-Spezifikation besagt, dass der Methodensatz eines Zeigertyps T den Methodensatz seines entsprechenden Typs T enthält. Tut dies Bedeutet das, dass wir Methoden mit dem Empfänger T für Variablen vom Typ T aufrufen können?
Antwort:
Obwohl die Spezifikation dies vorschlägt, ist es wichtig, dies zu beachten Sie können Methoden von *T nicht direkt auf T aufrufen. Stattdessen dereferenziert der Compiler die Variable automatisch auf &T und ruft die Methode auf, wodurch sie effektiv ausgeführt wird (&T).m().
Dieses Verhalten ist explizit in der Go-Spezifikation definiert:
"Aufrufe: Ein Methodenaufruf x.m() ist gültig, wenn der Methodensatz von (der Typ von ) x enthält m und die Argumentliste kann der Parameterliste von m zugewiesen werden. 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() }
Obwohl wir die SayWat-Methode mit einem Empfänger von *User deklariert haben, können wir sie für einen Benutzer aufrufen, der vom Typ „Benutzer“ ist. Der Compiler übernimmt die Dereferenzierung automatisch und ruft (&user).SayWat().
Ausnahme:
auf. 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()kann nicht aufgerufen werden
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3