Heim >Backend-Entwicklung >Golang >Warum können Go-Strukturen mit Wertempfängern keine Schnittstellen mit Zeigerempfängern erfüllen?

Warum können Go-Strukturen mit Wertempfängern keine Schnittstellen mit Zeigerempfängern erfüllen?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-04 01:40:11571Durchsuche

Why Can't Go Structs with Value Receivers Fulfill Interfaces with Pointer Receivers?

Warum können Go-Strukturvariablen keine Schnittstellen mit Zeigerempfängern implementieren?

In Go können Strukturmethoden entweder Wertempfänger haben (die funktionieren). auf dem Strukturwert direkt) oder Zeigerempfänger (die auf einem Zeiger auf die Struktur operieren). Bei der Implementierung von Schnittstellen gibt es subtile Einschränkungen, welche Typen die Schnittstelle je nach Empfängertyp der Schnittstellenmethoden erfüllen können.

Beachten Sie den folgenden Code:

type greeter interface {
    hello()
    goodbye()
}

type tourGuide struct {
    name string
}

Wir können Methoden mit definieren Sowohl Wert- als auch Zeigerempfänger für tourGuide:

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

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

Hier ist der Schlüssel Unterschied:

  • Variablen oder Kopien von tourGuide können sowohl Wert- als auch Zeigerempfängermethoden aufrufen:

    var t1 tourGuide = tourGuide{"James"}
    t1.hello()   // works
    t1.goodbye() // works
  • Schnittstellenvariablen können jedoch nur sein von Typen zugewiesen, die alle Schnittstellenmethoden mit demselben Empfängertyp wie die Schnittstelle implementieren können selbst:

    var g2 greeter = &t2 // works because *tourGuide implements greeter's pointer receiver methods
    
    // illegal: t1 is not assignable to g1
    // var g1 greeter = t1 // error: cannot use tourGuide as type greeter in assignment because tourGuide does not implement greeter (hello method has value receiver)

Warum kann t1 die Greeter-Schnittstelle nicht implementieren?

Der Grund dafür ist, dass die hello()-Methode in der Greeter-Schnittstelle eine hat Zeigerempfänger, d. h. er erwartet als Empfänger einen Zeiger auf einen tourGuide-Wert. Allerdings ist t1 eine Variable (kein Zeiger). Auch wenn Wertvariablen adressierbar sind, enthalten Schnittstellenwerte Kopien der gespeicherten Werte und keine Referenzen. Daher wird beim Zuweisen einer Wertvariablen zu einer Schnittstellenvariablen eine neue Kopie erstellt, die nicht dereferenziert und als Empfänger für Zeigerempfängermethoden übergeben werden kann.

Zusammenfassend lässt sich sagen, dass bei der Implementierung von Schnittstellen mit Zeigerempfängermethoden nur Zeiger verwendet werden Der implementierende Typ kann die Schnittstelle erfüllen. Wertvariablen oder Kopien können solchen Schnittstellen nicht zugewiesen werden, da sie nicht den erforderlichen Zeigerempfängertyp bereitstellen können.

Das obige ist der detaillierte Inhalt vonWarum können Go-Strukturen mit Wertempfängern keine Schnittstellen mit Zeigerempfängern 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