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
Susan Sarandonoriginal
2024-11-30 05:16:19329parcourir

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

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!

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