Warum kann ich einer Schnittstelle mit Zeigerempfängermethoden in Go keinen Wertempfänger zuweisen?

Linda Hamilton
Freigeben: 2024-11-24 04:15:20
Original
558 Leute haben es durchsucht

Why Can't I Assign a Value Receiver to an Interface with Pointer Receiver Methods in Go?

Empfängertypen für die Go-Schnittstellenimplementierung verstehen

In Go können Methoden entweder Wertempfänger haben (func (t T) m()) oder Zeigerempfänger (func (t *T) m()) für Typen struct. Der Empfängertyp bestimmt den Wert, der beim Aufruf der Methode verwendet werden soll.

Bedenken Sie den folgenden Code:

import "fmt"

type greeter interface {
    hello()
    goodbye()
}

type tourGuide struct {
    name string
}

func (t tourGuide) hello() {
    fmt.Println("Hello", t.name)
}

func (t *tourGuide) goodbye() {
    fmt.Println("Goodbye", t.name)
}

func main() {
    var t1 tourGuide = tourGuide{"James"}
    t1.hello() // Hello James
    t1.goodbye() // Goodbye James (same as (&t1).goodbye())

    var t2 *tourGuide = &tourGuide{"Smith"}
    t2.hello() // Hello Smith
    t2.goodbye() // Goodbye Smith (same as (*t2).hello())

    // illegal: t1 is not assignable to g1 (why?)
    // var g1 greeter = t1

    var g2 greeter = t2
    g2.hello() // Hello Smith
    g2.goodbye() // Goodbye Smith
}
Nach dem Login kopieren

Sie fragen sich vielleicht, warum Sie Methoden von tourGuide mit einer Variablen t1 aufrufen können vom Typ tourGuide oder einen Zeiger t2 vom Typ *tourGuide, aber Sie können t1 nicht einer Schnittstellenvariablen g1 vom Typ zuweisen Begrüßer.

Der Grund liegt im Empfängertyp der Schnittstellenmethoden. In diesem Fall verfügen sowohl hello als auch goodbye über Zeigerempfänger. Daher kann nur ein Zeigerwert als Empfängerwert verwendet werden.

Wenn Sie t1.hello() und t1.goodbye() aufrufen, übernimmt der Compiler automatisch die Adresse von t1 und verwendet diese als Empfänger , weil t1 ein adressierbarer Wert ist.

Wenn Sie jedoch versuchen, t1 g1 zuzuweisen, stellt der Compiler fest, dass t1 kein Zeigerwert ist. sondern ein Wert vom Typ tourGuide. Schnittstellen sind nicht adressierbar, daher kann der Compiler die Adresse von t1 nicht nehmen und sie g1 zuweisen.

Zusammenfassend lässt sich sagen, dass Zeigerempfänger einen Zeigerwert benötigen, um die Methode aufzurufen, während Wertempfänger entweder mit einem Wert aufgerufen werden können oder Zeiger. Bei der Implementierung von Schnittstellen mit Zeigerempfängermethoden können der Schnittstelle nur Zeigerwerte zugewiesen werden.

Das obige ist der detaillierte Inhalt vonWarum kann ich einer Schnittstelle mit Zeigerempfängermethoden in Go keinen Wertempfänger zuweisen?. 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