Symboles de plugin en tant que retours de fonction
Dans Go, il est possible d'importer un plugin qui implémente une interface commune définie en dehors des deux packages. Lors du renvoi d'une structure depuis le plugin, l'interface est correctement implémentée. Cependant, tenter de renvoyer directement une interface échoue en raison de certains détails techniques du système de plugins de Go.
La raison réside dans la nature des symboles du plugin. Lors de la recherche d'une variable nommée Greeter à partir d'un plugin à l'aide de Plugin.Lookup(), il renvoie un pointeur vers cette variable. Ceci est nécessaire pour permettre d'apporter des modifications à la variable au sein du plugin.
L'impression du type de la valeur stockée dans sym révélera s'il s'agit d'un pointeur vers l'interface (iface.IPlugin) ou une valeur d'interface réelle (iface.IPlugin). Dans le cas où le plugin renvoie une structure, la valeur stockée dans sym est de type main.testpl, qui implémente iface.IPlugin, donc l'assertion de type réussit.
Cependant, lorsque le plugin renvoie iface .IPlugin, la valeur stockée dans sym est de type *iface.IPlugin. Ce pointeur vers une valeur d'interface ne satisfait directement aucune interface, y compris iface.IPlugin. Par conséquent, l'assertion de type échoue.
Pour contourner ce problème, le plugin peut être modifié pour exposer une fonction qui renvoie l'interface Greeter au lieu d'une variable globale :
func Greeter() iface.IPlugin { return testpl{} }
Cela exposera un symbole nommé Greeter de type func() iface.IPlugin. Lors d'une recherche à l'aide de Plugin.Lookup(), il renverra un pointeur de fonction. Cela élimine le besoin d'un pointeur vers la valeur de l'interface et permet l'assertion de type correcte :
greeterFunc, ok := GetFilter.(func() iface.IPlugin) if !ok { panic(errors.New("not of expected type")) } greeter := greeterFunc()
Cette méthode fournit une approche plus claire et plus cohérente pour exposer les fonctionnalités du plugin tout en évitant les pièges associés au renvoi direct des interfaces. à partir des plugins.
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!