Le plugin Go 1.8 utilise une interface personnalisée
De nombreux plugins Go nécessitent la possibilité de leur transmettre des interfaces personnalisées complexes. Il n'est malheureusement pas actuellement possible de faire cela normalement dans l'implémentation d'origine du plugin.
Une façon d'éviter ce problème est de faire en sorte que le plugin renvoie une valeur de type interface{}. L'application principale peut alors définir l'interface qu'elle attend et utiliser l'assertion de type sur la valeur interface{} renvoyée par le plugin.
Par exemple, le code du plugin peut ressembler à ceci :
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 }
Et le code principal de l'application pourrait ressembler à ceci :
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 }
Une autre solution consiste à définir l'interface dans un package en dehors du plugin, et le plugin et votre application peuvent l'importer et faites-y référence.
Par exemple, si l'interface est définie dans le package filter :
package filter type Filter interface { Name() string Age() int }
Alors le code du plugin pourrait ressembler à ceci :
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 }
Et le principal le code de l'application pourrait ressembler à ceci :
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()) }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!