Heim >Backend-Entwicklung >Golang >Warum geben Go-Plugins keine Schnittstellen direkt zurück und wie kann das Problem behoben werden?

Warum geben Go-Plugins keine Schnittstellen direkt zurück und wie kann das Problem behoben werden?

Barbara Streisand
Barbara StreisandOriginal
2024-11-24 05:51:10299Durchsuche

Why Do Go Plugins Fail to Return Interfaces Directly, and How Can This Be Resolved?

Plugin-Symbole als Funktionsrückgaben

In Go ist es möglich, ein Plugin zu importieren, das eine gemeinsame Schnittstelle implementiert, die außerhalb beider Pakete definiert ist. Bei der Rückgabe einer Struktur vom Plugin wird die Schnittstelle korrekt implementiert. Der Versuch, eine Schnittstelle direkt zurückzugeben, schlägt jedoch aufgrund bestimmter technischer Probleme im Plugin-System von Go fehl.

Der Grund liegt in der Natur der Plugin-Symbole. Wenn Sie mit Plugin.Lookup() in einem Plugin nach einer Variablen namens Greeter suchen, wird ein Zeiger auf diese Variable zurückgegeben. Dies ist notwendig, damit innerhalb des Plugins Änderungen an der Variablen vorgenommen werden können.

Das Ausdrucken des Typs des in sym gespeicherten Werts zeigt, ob es sich um einen Zeiger auf die Schnittstelle (iface.IPlugin) handelt oder ein tatsächlicher Schnittstellenwert (iface.IPlugin). Wenn das Plugin eine Struktur zurückgibt, ist der in sym gespeicherte Wert vom Typ main.testpl, der iface.IPlugin implementiert, sodass die Typzusicherung erfolgreich ist.

Wenn das Plugin jedoch iface zurückgibt .IPlugin, der in sym gespeicherte Wert ist vom Typ *iface.IPlugin. Dieser Zeiger auf einen Schnittstellenwert erfüllt keine Schnittstellen direkt, einschließlich iface.IPlugin. Daher schlägt die Typzusicherung fehl.

Um dieses Problem zu umgehen, kann das Plugin so geändert werden, dass eine Funktion verfügbar gemacht wird, die die Greeter-Schnittstelle anstelle einer globalen Variablen zurückgibt:

func Greeter() iface.IPlugin { return testpl{} }

Dies wird verfügbar gemacht ein Symbol namens Greeter mit dem Typ func() iface.IPlugin. Beim Nachschlagen mit Plugin.Lookup() wird ein Funktionszeiger zurückgegeben. Dadurch entfällt die Notwendigkeit eines Zeigers auf den Schnittstellenwert und ermöglicht die korrekte Typzusicherung:

greeterFunc, ok := GetFilter.(func() iface.IPlugin)
if !ok {
    panic(errors.New("not of expected type"))
}
greeter := greeterFunc()

Diese Methode bietet einen klareren und konsistenteren Ansatz zum Offenlegen der Plugin-Funktionalität und vermeidet gleichzeitig die Fallstricke, die mit der direkten Rückgabe von Schnittstellen verbunden sind von Plugins.

Das obige ist der detaillierte Inhalt vonWarum geben Go-Plugins keine Schnittstellen direkt zurück und wie kann das Problem behoben werden?. 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