Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Alternatives pour le chargement d'un plugin via -buildplugin #1

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

Conversation

benoitmasson
Copy link
Member

@benoitmasson benoitmasson commented Feb 9, 2017

@fsamin

Merci pour la présentation d'hier, et désolé de ne pas avoir pu rester, on aurait pu discuter de cette PR ;-)

La partie 4 avec les plugins natifs en go 1.8 m'a bien plu et fait réfléchir (je savais pas que ça arrivait, c'est une bonne nouvelle !), voilà le résultat de mes réflexions et tests.

  • Le symbole exporté semble être un pointeur vers le symbole, en fait. Je soupçonne que le pb que tu rencontrais en définissant le type de la fonction dans ton fichier main.go venait de là.

  • Je n'ai pas réussi à le résoudre simplement, uniquement en passant par un type partagé entre le binaire et les plugins (types.MyFunc, cf commit 7fac008) et en explicitant le déréférencement du pointeur dans le cast.

  • Je préfère (comme j'ai pu le faire en C++ par le passé) exporter un objet qui satisfait une interface commune, ça me semble plus clair, plus naturel et plus propre. C'est l'objet des 2 autres commits, qui chargent un objet de type types.Greeter (interface capable d'appeler une fonction Greetings(...string) string).
    Dans le dernier commit (a538af9), je caste l'objet en l'interface avant l'export, ça permet de vérifier à la compilation qu'il sera bien compatible (mais ça oblige à nouveau à déréférencer l'interface une fois chargée).
    Je n'ai pas vraiment de préférence à priori entre ces 2 façons de faire… la première est plus sobre à écrire, la seconde plus sûre.

Définition du type du symbole chargé à types.MyFunc
=> export du symbole forcé à ce type

/!\ go-plugin reçoit un pointeur vers l'objet, il faut donc
    charger un pointeur *types.MyFunc et le déréférencer ensuite.
On récupère un objet de type Greeter : le contrat d'interface
nous dit ce qu'il fait, sans dire comment.

/!\ La question de la récupération d'un pointeur est invisible ici,
    car *worldGreeter et *reverseGreeter satisfont bien l'interface
    types.Greeter.
Permet de vérifier dès la compilation que le plugin fournit
bien un objet du bon type.

/!\ la manipulation du pointeur vers l'interface une fois chargé
    doit à nouveau être explicite.
@fsamin fsamin self-assigned this Feb 9, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants