Können Go-Methoden mit Empfängertyp „T' für Variablen vom Typ „*T' aufgerufen werden?

Mary-Kate Olsen
Freigeben: 2024-11-17 18:27:02
Original
584 Leute haben es durchsucht

Can Go Methods with Receiver Type `T` Be Called on Variables of Type `*T`?

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()
}
Nach dem Login kopieren

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()
Nach dem Login kopieren

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!

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