Implémentation de l'interface symbolique dans le plugin
Dans les plugins Go, l'importation d'un plugin avec une interface externe pose des défis lorsque l'on tente de renvoyer l'interface en tant que réponse de la fonction plugin. Ce comportement n'est pas simple, mais peut être compris grâce à l'examen des variables et des interfaces du plugin.
Types de variables de plugin
Variable d'un plugin, telle que "Greeter" dans votre exemple existe sous forme de pointeur vers son type déclaré. Par conséquent, l’utilisation de la fonction Lookup renverra un pointeur vers la variable, et non vers sa valeur. Cela devient important lorsque vous essayez de saisir une interface à partir de la valeur obtenue.
Saisie d'interface
Lorsque vous essayez de saisir une interface (par exemple, iface.IPlugin) à partir de un pointeur vers cette interface (par exemple, *iface.IPlugin), vous rencontrerez une erreur. En effet, une valeur d'un type pointeur vers une interface ne satisfait jamais aucune interface à l'exception de l'interface vide.
Résolution
Pour résoudre ce problème, il existe deux approches :
Déréférencer le Pointeur :
Au lieu d'une assertion de type à partir d'un pointeur vers une interface, vous devez d'abord déréférencer le pointeur pour obtenir la valeur, puis tenter une assertion de type. Par exemple :
pgPtr, ok := sym.(*iface.IPlugin) if !ok { panic(errors.New("error binding plugin to interface")) } pg := *pgPtr
Exposer une fonction :
Pour éviter la complexité du déréférencement de pointeur, envisagez d'exposer une fonction dans le plugin qui renvoie l'implémentation de l'interface. La variable du plugin "Greeter" deviendrait alors une fonction qui ne prend aucun argument et renvoie iface.IPlugin.
Exemple de code
Voici le deuxième approche implémentée dans votre plugin :
func Greeter() iface.IPlugin { return testpl{} }
Et la recherche et l'utilisation correspondantes dans l'ensemble programme :
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() fmt.Printf("You're now connected to: %s \n", greeter.WhatsYourName()) greeter.SayHello("user") greeter.SayGoodby("user")
Cette approche simplifie le processus d'obtention de l'implémentation de l'interface à partir du plugin et vous permet d'éviter les nuances de gestion du pointeur.
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!