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:
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:
pgPtr, ok := sym.(*iface.IPlugin) if !ok { panic(errors.New("error binding plugin to interface")) } pg := *pgPtr
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!