Skip to content

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