【发布时间】:2017-02-14 05:22:57
【问题描述】:
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()
}
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"
}
这里的想法是 plugin1 调用 plugin2 的内部非main 函数。
主程序
主程序加载一些作为参数给出的插件,并从最后一个插件调用TestPlugin()。
测试 1:
构建两个插件,加载两个插件,调用TestPlugin(),输出包含"help234",即调用了内部函数。这可以理解,因为两个插件都加载了,一个插件可以调用另一个插件的内部代码。
测试 2:
只加载plugin1,调用TestPlugin(),输出包含"help234",即调用了内部函数。观察到与 test1 中相同的输出。或许这次的方法是从GOPATH找到的。
测试 3:
将文件夹"github.com/vimal/testplugin1"重命名为"github.com/vimal/junk1",删除plugin2,只加载plugin1,调用TestPlugin()。输出仍然包含"help234",即调用了内部函数。
我无法理解 test3 如何产生相同的输出。 plugin1 是否也包含 plugin2 代码?如何理解 Go 插件对其他 Go 插件的依赖?
Go 版本:go version go1.8rc3 linux/amd64
【问题讨论】:
标签: go plugins dependencies