Alternatives pour le chargement d'un plugin via -buildplugin #1
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
@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 commit7fac008
) 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 fonctionGreetings(...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.