Go 1.8-Plugin verwendet benutzerdefinierte Schnittstelle
Viele Go-Plugins erfordern die Möglichkeit, komplexe benutzerdefinierte Schnittstellen an sie zu übergeben. Leider ist dies derzeit in der ursprünglichen Plugin-Implementierung normalerweise nicht möglich.
Eine Möglichkeit, dieses Problem zu vermeiden, besteht darin, das Plugin dazu zu bringen, einen Wert vom Typ interface{} zurückzugeben. Die Hauptanwendung kann dann die erwartete Schnittstelle definieren und die Typzusicherung für den vom Plugin zurückgegebenen Wert interface{} verwenden.
Der Plugin-Code könnte beispielsweise so aussehen:
package main import ( "fmt" ) type plgFilter struct{} func (plgFilter) Name() string { return "Bob" } func (plgFilter) Age() int { return 23 } func GetFilterIface() (f interface{}, err error) { f = plgFilter{} fmt.Printf("[plugin GetFilterIface] Returning filter: %T %v\n", f, f) return }
Und der Hauptanwendungscode könnte so aussehen:
package main import ( "fmt" "plugin" ) func main() { p, err := plugin.Open("pg/pg.so") if err != nil { panic(err) } GetFilterIface, err := p.Lookup("GetFilterIface") if err != nil { panic(err) } filterIface, err := GetFilterIface.(func() (interface{}, error))() fmt.Printf("GetFilterIface result: %T %v %v\n", filterIface, filterIface, err) myfilter := filterIface.(MyFilter) fmt.Println("\tName:", myfilter.Name()) fmt.Println("\tAge:", myfilter.Age()) } type MyFilter interface { Name() string Age() int }
Eine andere Lösung besteht darin, die Schnittstelle in einem Paket außerhalb des Plugins zu definieren, und sowohl das Plugin als auch Ihre Anwendung können sie importieren und beziehen Sie sich darauf.
Zum Beispiel, wenn die Schnittstelle im Paketfilter definiert ist:
package filter type Filter interface { Name() string Age() int }
Dann könnte der Plugin-Code so aussehen:
package main import ( "fmt" "filter" ) type plgFilter struct{} func (plgFilter) Name() string { return "Bob" } func (plgFilter) Age() int { return 23 } func GetFilter() (f filter.Filter, err error) { f = plgFilter{} fmt.Printf("[plugin GetFilter] Returning filter: %T %v\n", f, f) return }
Und das Wichtigste Der Anwendungscode könnte so aussehen:
package main import ( "fmt" "filter" "plugin" ) func main() { p, err := plugin.Open("pg/pg.so") if err != nil { panic(err) } GetFilter, err := p.Lookup("GetFilter") if err != nil { panic(err) } filter, err := GetFilter.(func() (filter.Filter, error))() fmt.Printf("GetFilter result: %T %v %v\n", filter, filter, err) fmt.Println("\tName:", filter.Name()) fmt.Println("\tAge:", filter.Age()) }
Das obige ist der detaillierte Inhalt vonWie kann ich benutzerdefinierte Schnittstellen an Go 1.8-Plugins übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!