Heim > Backend-Entwicklung > Golang > Warum schlägt die Rückgabe einer Schnittstelle als Go-Plugin-Symbol fehl und wie kann das Problem behoben werden?

Warum schlägt die Rückgabe einer Schnittstelle als Go-Plugin-Symbol fehl und wie kann das Problem behoben werden?

Patricia Arquette
Freigeben: 2024-11-21 17:48:14
Original
904 Leute haben es durchsucht

Why Does Returning an Interface as a Go Plugin Symbol Fail, and How Can It Be Fixed?

Plugins an Schnittstellen binden: Ein Rätsel

In Go ist es möglich, Plugins zu erstellen, die bestimmte Schnittstellen implementieren. Es gibt jedoch ein eigenartiges Verhalten bei der Rückgabe einer Schnittstelle als Plugin-Symbol. Lassen Sie uns dieses Problem untersuchen und eine Lösung finden.

Die Schnittstelle und das Plugin:

Wir definieren ein Schnittstellen-IPlugin mit verschiedenen Methoden und erstellen ein Plugin, das eine Struktur testpl enthält setzt es um. Zunächst haben wir drei verschiedene getPlugin-Funktionen:

  • Die erste gibt direkt eine testpl-Struktur zurück, die wie erwartet funktioniert.
  • Die zweite gibt testpl als IPlugin-Schnittstelle zurück, schlägt jedoch fehl, wenn Bindung des Plugin-Symbols.
  • Der dritte gibt eine generische Schnittstelle{} zurück, die auch schlägt fehl.

Das Problem mit Lookup:

Die Lösung liegt im Verständnis, wie Plugin.Lookup() funktioniert. Es gibt einen Zeiger auf das gesuchte Symbol zurück. Für den Fall, dass das Plugin eine Variable bereitstellt (z. B. Greeter), ist der in sym gespeicherte Wert ein Zeiger auf die Variable.

Das Problem entsteht, wenn wir versuchen, das Plugin-Symbol an eine Schnittstelle zu binden. Ein Wert eines Zeigertyps auf eine Schnittstelle erfüllt niemals eine andere Schnittstelle außer der leeren Schnittstelle. Daher wird der Versuch, den Typ iface.IPlugin aus einem Wert vom Typ iface.IPlugin typzusichern, immer fehlschlagen.

Die Lösung:

Um dieses Problem zu beheben, müssen wir entweder:

  • eine Funktion vom Plugin zurückgeben, die den Begrüßer zurückgibt (Greeter() iface.IPlugin). Wenn wir also das Greeter-Symbol suchen, ist es vom Typ func() iface.IPlugin, was nicht erfordert, dass das Plugin-Paket einen Zeiger auf den Wert zurückgibt.
  • Dereferenzieren Sie den Zeiger des Plugin-Symbols auf Rufen Sie einen Wert vom Typ iface.IPlugin ab. Dies kann wie folgt erfolgen:
pgPtr, ok := sym.(*iface.IPlugin)
if !ok {
    panic(errors.New("error binding plugin to interface"))
}
pg := *pgPtr
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum schlägt die Rückgabe einer Schnittstelle als Go-Plugin-Symbol fehl und wie kann das Problem behoben 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