Maison > développement back-end > Golang > Pourquoi les plugins Go ne renvoient-ils pas directement les interfaces et comment cela peut-il être résolu ?

Pourquoi les plugins Go ne renvoient-ils pas directement les interfaces et comment cela peut-il être résolu ?

Barbara Streisand
Libérer: 2024-11-24 05:51:10
original
346 Les gens l'ont consulté

Why Do Go Plugins Fail to Return Interfaces Directly, and How Can This Be Resolved?

Symboles de plugin en tant que retours de fonction

Dans Go, il est possible d'importer un plugin qui implémente une interface commune définie en dehors des deux packages. Lors du renvoi d'une structure depuis le plugin, l'interface est correctement implémentée. Cependant, tenter de renvoyer directement une interface échoue en raison de certains détails techniques du système de plugins de Go.

La raison réside dans la nature des symboles du plugin. Lors de la recherche d'une variable nommée Greeter à partir d'un plugin à l'aide de Plugin.Lookup(), il renvoie un pointeur vers cette variable. Ceci est nécessaire pour permettre d'apporter des modifications à la variable au sein du plugin.

L'impression du type de la valeur stockée dans sym révélera s'il s'agit d'un pointeur vers l'interface (iface.IPlugin) ou une valeur d'interface réelle (iface.IPlugin). Dans le cas où le plugin renvoie une structure, la valeur stockée dans sym est de type main.testpl, qui implémente iface.IPlugin, donc l'assertion de type réussit.

Cependant, lorsque le plugin renvoie iface .IPlugin, la valeur stockée dans sym est de type *iface.IPlugin. Ce pointeur vers une valeur d'interface ne satisfait directement aucune interface, y compris iface.IPlugin. Par conséquent, l'assertion de type échoue.

Pour contourner ce problème, le plugin peut être modifié pour exposer une fonction qui renvoie l'interface Greeter au lieu d'une variable globale :

func Greeter() iface.IPlugin { return testpl{} }
Copier après la connexion

Cela exposera un symbole nommé Greeter de type func() iface.IPlugin. Lors d'une recherche à l'aide de Plugin.Lookup(), il renverra un pointeur de fonction. Cela élimine le besoin d'un pointeur vers la valeur de l'interface et permet l'assertion de type correcte :

greeterFunc, ok := GetFilter.(func() iface.IPlugin)
if !ok {
    panic(errors.New("not of expected type"))
}
greeter := greeterFunc()
Copier après la connexion

Cette méthode fournit une approche plus claire et plus cohérente pour exposer les fonctionnalités du plugin tout en évitant les pièges associés au renvoi direct des interfaces. à partir des plugins.

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