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
Susan Sarandonoriginal
2024-12-01 11:33:10679parcourir

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{} }

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()

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!

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