Maison > développement back-end > Golang > Comment puis-je renvoyer avec succès une interface à partir d'un plugin Go ?

Comment puis-je renvoyer avec succès une interface à partir d'un plugin Go ?

Susan Sarandon
Libérer: 2024-11-30 05:16:19
original
317 Les gens l'ont consulté

How Can I Successfully Return an Interface from a Go Plugin?

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 :

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

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

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!

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