Go 1.8支持Go插件。
我创建了两个插件,如下所示。
据我了解,该插件仅公开main包中的函数和变量。即plugin.Lookup()对于非main变量/函数将失败。
但是我想测试一个插件是否可以在内部从另一个插件调用方法,类似于C ++库如何调用另一个库。
所以我测试如下:
plugin1 github.com/vimal/testplugin
$ cat myplugin.go
package main
import "C"
import "fmt"
import help "github.com/vimal/testplugin1/plug"
func init() {
fmt.Printf("main.init invoked\n")
}
// TestPlugin
func TestPlugin() string {
return help.Help()
}
Run Code Online (Sandbox Code Playgroud)
plugin2 github.com/vimal/testplugin1
$ cat myplugin.go
package main
import "C"
func HelperFunc() string {
return "help"
}
$ cat plug/helper.go
package help
func Help() string {
return "help234"
}
Run Code Online (Sandbox Code Playgroud)
这里的想法是,plugin1调用plugin2的内部非main功能。
主程序
主程序加载作为参数给定的许多插件,并TestPlugin()从最后一个插件调用。
测试1:
构建两个插件,加载两个插件,然后调用invoke TestPlugin() …
我知道可以查找导出的 go-plugin 符号并将它们键入 assert 到interface 中。但是,我想知道是否有办法将它们输入到结构中,例如。有没有办法做到这一点?
例如:
插件
package main
type Person struct {
Name string
}
var (
P = Person{
Name: "Emma",
}
)
Run Code Online (Sandbox Code Playgroud)
应用程序
package main
import (
"fmt"
"plugin"
"os"
)
func main() {
plug, err := plugin.Open("./plugin.so")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
sym, err := plug.Lookup("P")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
var p Person
p, ok := sym.(Person)
if !ok {
fmt.Println("Wrong symbol type")
os.Exit(1)
}
fmt.Println(p.Name) …Run Code Online (Sandbox Code Playgroud)