From 7fac008b6284e31faed5bf585e5aafc05a827d7b Mon Sep 17 00:00:00 2001 From: Benoit Masson Date: Thu, 9 Feb 2017 13:40:58 +0100 Subject: [PATCH 1/3] =?UTF-8?q?go-plugin=20:=20utilisation=20d'un=20type?= =?UTF-8?q?=20partag=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- go-1-8/main.go | 4 +++- go-1-8/reverse/reverse.go | 4 +++- go-1-8/types/func.go | 3 +++ go-1-8/world/world.go | 4 +++- 4 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 go-1-8/types/func.go diff --git a/go-1-8/main.go b/go-1-8/main.go index e36f530..1be5a2e 100644 --- a/go-1-8/main.go +++ b/go-1-8/main.go @@ -5,6 +5,8 @@ import ( "log" "os" "plugin" + + "github.com/golang-rennes/demo-plugins/go-1-8/types" ) func main() { @@ -37,7 +39,7 @@ func registerPlugin(path string) (*Plugin, error) { return nil, err } - greet := funcSymbol.(func(...string) string) + greet := *funcSymbol.(*types.MyFunc) log.Printf("Plugin successfully installed\n") diff --git a/go-1-8/reverse/reverse.go b/go-1-8/reverse/reverse.go index 61157a2..a4c7171 100644 --- a/go-1-8/reverse/reverse.go +++ b/go-1-8/reverse/reverse.go @@ -3,6 +3,8 @@ package main import ( "C" "strings" + + "github.com/golang-rennes/demo-plugins/go-1-8/types" ) func reverse(s string) (result string) { @@ -12,7 +14,7 @@ func reverse(s string) (result string) { return } -func Greetings(args ...string) string { +var Greetings types.MyFunc = func(args ...string) string { name := reverse(strings.Join(args, "_")) return name } diff --git a/go-1-8/types/func.go b/go-1-8/types/func.go new file mode 100644 index 0000000..7d45ec4 --- /dev/null +++ b/go-1-8/types/func.go @@ -0,0 +1,3 @@ +package types + +type MyFunc func(...string) string diff --git a/go-1-8/world/world.go b/go-1-8/world/world.go index aecb77d..c94a57f 100644 --- a/go-1-8/world/world.go +++ b/go-1-8/world/world.go @@ -3,8 +3,10 @@ package main import ( "C" "strings" + + "github.com/golang-rennes/demo-plugins/go-1-8/types" ) -func Greetings(args ...string) string { +var Greetings types.MyFunc = func(args ...string) string { return "World " + strings.Join(args, " ") } From f4b734fb41d2f84f665813daf755828ebeaaa056 Mon Sep 17 00:00:00 2001 From: Benoit Masson Date: Thu, 9 Feb 2017 13:49:59 +0100 Subject: [PATCH 2/3] go-plugin : utilisation d'une interface pour abstraire le plugin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- go-1-8/main.go | 8 ++++---- go-1-8/reverse/reverse.go | 8 +++++--- go-1-8/types.go | 6 ++++-- go-1-8/types/interface.go | 5 +++++ go-1-8/world/world.go | 8 +++++--- 5 files changed, 23 insertions(+), 12 deletions(-) create mode 100644 go-1-8/types/interface.go diff --git a/go-1-8/main.go b/go-1-8/main.go index 1be5a2e..b44d7df 100644 --- a/go-1-8/main.go +++ b/go-1-8/main.go @@ -34,18 +34,18 @@ func registerPlugin(path string) (*Plugin, error) { return nil, err } - funcSymbol, err := p.Lookup("Greetings") + interfaceSymbol, err := p.Lookup("Greeter") if err != nil { return nil, err } - greet := *funcSymbol.(*types.MyFunc) + greet := interfaceSymbol.(types.Greeter) log.Printf("Plugin successfully installed\n") plugin := &Plugin{ - Path: path, - Greetings: greet, + Path: path, + Greeter: greet, } return plugin, nil diff --git a/go-1-8/reverse/reverse.go b/go-1-8/reverse/reverse.go index a4c7171..c937419 100644 --- a/go-1-8/reverse/reverse.go +++ b/go-1-8/reverse/reverse.go @@ -3,10 +3,10 @@ package main import ( "C" "strings" - - "github.com/golang-rennes/demo-plugins/go-1-8/types" ) +type reverseGreeter struct{} + func reverse(s string) (result string) { for _, v := range s { result = string(v) + result @@ -14,7 +14,9 @@ func reverse(s string) (result string) { return } -var Greetings types.MyFunc = func(args ...string) string { +func (g reverseGreeter) Greetings(args ...string) string { name := reverse(strings.Join(args, "_")) return name } + +var Greeter = reverseGreeter{} diff --git a/go-1-8/types.go b/go-1-8/types.go index fe0d93e..1c6ab0d 100644 --- a/go-1-8/types.go +++ b/go-1-8/types.go @@ -1,6 +1,8 @@ package main +import "github.com/golang-rennes/demo-plugins/go-1-8/types" + type Plugin struct { - Path string - Greetings func(...string) string + Path string + types.Greeter } diff --git a/go-1-8/types/interface.go b/go-1-8/types/interface.go new file mode 100644 index 0000000..aba34ef --- /dev/null +++ b/go-1-8/types/interface.go @@ -0,0 +1,5 @@ +package types + +type Greeter interface { + Greetings(args ...string) string +} diff --git a/go-1-8/world/world.go b/go-1-8/world/world.go index c94a57f..10b12f1 100644 --- a/go-1-8/world/world.go +++ b/go-1-8/world/world.go @@ -3,10 +3,12 @@ package main import ( "C" "strings" - - "github.com/golang-rennes/demo-plugins/go-1-8/types" ) -var Greetings types.MyFunc = func(args ...string) string { +type worldGreeter struct{} + +func (g worldGreeter) Greetings(args ...string) string { return "World " + strings.Join(args, " ") } + +var Greeter = worldGreeter{} From a538af9c127b546436e84a04bd8126c265258bca Mon Sep 17 00:00:00 2001 From: Benoit Masson Date: Thu, 9 Feb 2017 13:57:42 +0100 Subject: [PATCH 3/3] =?UTF-8?q?go-plugin=20:=20type=20export=C3=A9=20par?= =?UTF-8?q?=20le=20plugin=20forc=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- go-1-8/main.go | 2 +- go-1-8/reverse/reverse.go | 4 +++- go-1-8/world/world.go | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/go-1-8/main.go b/go-1-8/main.go index b44d7df..54b964d 100644 --- a/go-1-8/main.go +++ b/go-1-8/main.go @@ -39,7 +39,7 @@ func registerPlugin(path string) (*Plugin, error) { return nil, err } - greet := interfaceSymbol.(types.Greeter) + greet := *interfaceSymbol.(*types.Greeter) log.Printf("Plugin successfully installed\n") diff --git a/go-1-8/reverse/reverse.go b/go-1-8/reverse/reverse.go index c937419..8d9a487 100644 --- a/go-1-8/reverse/reverse.go +++ b/go-1-8/reverse/reverse.go @@ -3,6 +3,8 @@ package main import ( "C" "strings" + + "github.com/golang-rennes/demo-plugins/go-1-8/types" ) type reverseGreeter struct{} @@ -19,4 +21,4 @@ func (g reverseGreeter) Greetings(args ...string) string { return name } -var Greeter = reverseGreeter{} +var Greeter = types.Greeter(reverseGreeter{}) diff --git a/go-1-8/world/world.go b/go-1-8/world/world.go index 10b12f1..3007581 100644 --- a/go-1-8/world/world.go +++ b/go-1-8/world/world.go @@ -3,6 +3,8 @@ package main import ( "C" "strings" + + "github.com/golang-rennes/demo-plugins/go-1-8/types" ) type worldGreeter struct{} @@ -11,4 +13,4 @@ func (g worldGreeter) Greetings(args ...string) string { return "World " + strings.Join(args, " ") } -var Greeter = worldGreeter{} +var Greeter = types.Greeter(worldGreeter{})