【发布时间】:2017-05-18 15:36:58
【问题描述】:
我正在用 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
编辑:添加示例代码
【问题讨论】:
-
显示一些代码。
-
问题中链接了完整的源代码。 github.com/patrobinson/go-fish
-
不要指望大家去项目里看每个文件看哪个部分不行,至少写个例子复现问题。
-
好的,我很快就会举一个更简单的例子
-
修复执行的一种方法是在每个插件中使用不同的类型,例如
type pluginA string和type pluginB string以防止类型冲突。
标签: go