Maison >développement back-end >Golang >Pourquoi le retour d'un symbole de plugin en tant que fonction résout-il les problèmes de liaison de l'interface du plugin Go ?
Lors de la tentative d'importation d'un plugin qui implémente une interface définie en dehors des deux packages, la liaison du symbole du plugin à une interface échoue. Cela se produit malgré l'implémentation structurelle de l'interface par le plugin.
Le problème vient de l'approche consistant à rechercher une variable à partir du plugin, qui renvoie un pointeur vers cette variable. Taper affirmer une interface à partir d’une valeur de type pointeur vers l’interface ne réussit jamais. Au lieu de cela, la solution consiste à exporter une fonction du plugin qui renvoie le type d'interface souhaité.
func Greeter() iface.IPlugin { return testpl{} }
Le package du plugin fonctionne en renvoyant des pointeurs vers des valeurs lors de la recherche de variables. Pour une variable de type iface.IPlugin, cela se traduit par un pointeur vers une interface, dont le type ne peut pas être affirmé sur iface.IPlugin.
En renvoyant une fonction depuis le plugin, l'opération de recherche ne nécessite plus de pointeur . La fonction peut ensuite être invoquée pour obtenir la valeur d'interface souhaitée.
Pour utiliser cette approche, la définition du plugin doit être mise à jour pour exposer une fonction qui renvoie l'implémentation de l'interface. Le programme peut ensuite rechercher cette fonction et l'utiliser pour obtenir l'instance de greeter.
// In the plugin func Greeter() iface.IPlugin { return testpl{} } // In the main program Greeter, err := p.Lookup("Greeter") if err != nil { panic(err) } greeterFunc, ok := Greeter.(func() iface.IPlugin) if !ok { panic(errors.New("not of expected type")) } greeter := greeterFunc()
Cette approche évite les tracas des assertions de type indirectes et la confusion causée par l'utilisation de pointeurs. De plus, cela s'aligne sur une manière plus intuitive d'exposer les fonctionnalités d'un plugin.
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!