我在Golang写了一个Rules Engine。我的测试涉及构建和加载两个插件,它们进行一些非常简单的字符串比较。我通过执行fileglob并调用plugin.Open()
来加载插件,到目前为止,我们得到了两个不同的对象。但是当我调用plug.Lookup(symbol)
时,返回的符号始终是对第一个插件的引用。
DEBU[0000] Starting A rule
DEBU[0000] Starting A rule
我已经调试回来以确保插件是不同的对象,它们是,但符号查找不能按预期工作。
这是一个人为的工作示例:
main.go 包主要
import "plugin"
import "fmt"
func main() {
aPlug, _ := plugin.Open("testdata/plugins/a.so")
aSymPlug, _ := aPlug.Lookup("Rule")
fmt.Printf("Plugin: %v loaded\n", aSymPlug)
bPlug, _ := plugin.Open("testdata/plugins/b.so")
bSymPlug, _ := bPlug.Lookup("Rule")
fmt.Printf("Plugin: %v loaded\n", bSymPlug)
}
a.go插件
package main
type plugin string
func init() {
Rule = "a"
}
func (p plugin) String() string {
return string(p)
}
var Rule plugin
b.go插件
package main
type plugin string
func init() {
Rule = "b"
}
func (p plugin) String() string {
return string(p)
}
var Rule plugin
但是,当我更改插件以返回字符串“a”或“b”(无论哪个或哪两个插件都无关紧要)而不是p
时,它会加载错误的插件!即。
package main
type plugin string
func init() {
Rule = "b"
}
func (p plugin) String() string {
return "b"
}
var Rule plugin
输出:
Plugin: a loaded
Plugin: a loaded
编辑:添加了示例代码
答案 0 :(得分:0)
这是一个Golang错误(请参阅https://github.com/golang/go/issues/20376)
正如Motakjuq所指出的,解决方法是更改类型的名称,以便每个插件具有不同的类型。这可以避免碰撞。