Heim >Backend-Entwicklung >Golang >Warum kann eine Go-Struktur mit einer Zeigerempfängermethode eine Schnittstelle nicht erfüllen?

Warum kann eine Go-Struktur mit einer Zeigerempfängermethode eine Schnittstelle nicht erfüllen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-19 17:56:02927Durchsuche

Why Can't a Go Struct with a Pointer Receiver Method Satisfy an Interface?

Typen von Go-Strukturmethoden, die eine Schnittstelle erfüllen

In Go können Strukturen Methoden mit unterschiedlichen Empfängertypen (Wert oder Zeiger) haben. Während eine Methode mit einem Wertempfänger entweder für einen Wert oder einen Zeiger der Struktur aufgerufen werden kann, erfordert eine Methode mit einem Zeigerempfänger einen Zeigerempfänger.

Betrachten Sie das bereitgestellte Beispiel:

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) }

Wir können die Methoden von tourGuide sowohl mit einem Wert t1 als auch mit einem Zeiger t2 aufrufen. Bei der Implementierung von Schnittstellen ist jedoch die Zuweisung eines tourGuide-Werts zu einer Greeter-Schnittstellenvariablen nicht zulässig.

Der Grund dafür ist, dass wenn eine Methode einen Zeigerempfänger hat, nur ein Zeigerwert als Empfänger verwendet werden kann. Da Schnittstellenwerte Kopien der verpackten Werte sind und nicht adressierbar sind, können sie nicht an Methoden mit Zeigerempfängern übergeben werden.

Diese Einschränkung verhindert potenzielle Probleme, bei denen sich über den Zeigerempfänger vorgenommene Änderungen nur auf die Kopie in der Schnittstelle auswirken würden. nicht der ursprüngliche Wert.

Damit eine Schnittstelle einen Werttyp akzeptieren kann, müssen alle ihre Methoden Wertempfänger haben. Da goodbye in unserem Beispiel einen Zeigerempfänger hat, kann tourGuide nicht dem Greeter zugewiesen werden.

Das obige ist der detaillierte Inhalt vonWarum kann eine Go-Struktur mit einer Zeigerempfängermethode eine Schnittstelle nicht erfüllen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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