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 ?

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 ?

Susan Sarandon
Libérer: 2024-12-01 11:33:10
original
696 Les gens l'ont consulté

Why Does Returning a Plugin Symbol as a Function Solve Go Plugin Interface Binding Issues?

Symbole du plugin comme retour de fonction

Problème

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.

Solution

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{} }
Copier après la connexion

Explication

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.

Utilisation

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()
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal