Maison  >  Article  >  développement back-end  >  Pourquoi le renvoi d'une interface en tant que symbole de plugin Go échoue-t-il et comment peut-il être corrigé ?

Pourquoi le renvoi d'une interface en tant que symbole de plugin Go échoue-t-il et comment peut-il être corrigé ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-21 17:48:14846parcourir

Why Does Returning an Interface as a Go Plugin Symbol Fail, and How Can It Be Fixed?

Liaison de plugins à des interfaces : une énigme

Dans Go, il est possible de créer des plugins qui implémentent des interfaces spécifiques. Cependant, il existe un comportement particulier lors du renvoi d'une interface sous forme de symbole de plugin. Examinons ce problème et explorons une solution.

L'interface et le plugin :

Nous définissons une interface IPlugin avec diverses méthodes et créons un plugin contenant une structure testpl qui le met en œuvre. Initialement, nous avons trois fonctions getPlugin différentes :

  • La première renvoie directement une structure testpl, qui fonctionne comme prévu.
  • La seconde renvoie testpl en tant qu'interface IPlugin, mais elle échoue lorsque liant le symbole du plugin.
  • Le troisième renvoie une interface générique{}, qui également échoue.

Le problème avec Lookup :

La solution réside dans la compréhension du fonctionnement de Plugin.Lookup(). Il renvoie un pointeur vers le symbole recherché. Dans le cas où le plugin expose une variable (comme Greeter), la valeur stockée dans sym est un pointeur vers la variable.

Le problème survient lorsque l'on essaie de lier le symbole du plugin à une interface. Une valeur de type pointeur vers une interface ne satisfait jamais aucune interface à l’exception de l’interface vide. Par conséquent, tenter d'affirmer le type iface.IPlugin à partir d'une valeur de type iface.IPlugin échouera toujours.

La solution :

Pour résoudre ce problème, nous devons soit :

  • Renvoyer une fonction du plugin qui renvoie le greeter (Greeter() iface.IPlugin). De cette façon, lorsque nous rechercherons le symbole Greeter, il sera de type func() iface.IPlugin, ce qui ne nécessite pas que le package du plugin renvoie un pointeur vers la valeur.
  • Déréférencer le pointeur du symbole du plugin vers obtenir une valeur de type iface.IPlugin. Cela peut être fait comme suit :
pgPtr, ok := sym.(*iface.IPlugin)
if !ok {
    panic(errors.New("error binding plugin to interface"))
}
pg := *pgPtr

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn