Golang 1.8插件。查找仅加载第一个插件
我正在戈朗写一篇文章。我的测试包括构建和加载两个插件,它们进行一些非常简单的字符串比较。我通过执行fileglob并调用Golang 1.8插件。查找仅加载第一个插件,go,Go,我正在戈朗写一篇文章。我的测试包括构建和加载两个插件,它们进行一些非常简单的字符串比较。我通过执行fileglob并调用plugin.Open(),加载插件,到目前为止,我们得到了两个不同的对象。但是当我调用plug.Lookup(symbol)时,返回的符号总是对第一个插件的引用 DEBU[0000] Starting A rule DEBU[0000] Starting A rule 我已经重新调试,以确保插件是不同的对象,它们是不同的对象,但是符号查找没有按预期工作 下面是一个精心设计
plugin.Open()
,加载插件,到目前为止,我们得到了两个不同的对象。但是当我调用plug.Lookup(symbol)时,返回的符号总是对第一个插件的引用
DEBU[0000] Starting A rule
DEBU[0000] Starting A rule
我已经重新调试,以确保插件是不同的对象,它们是不同的对象,但是符号查找没有按预期工作
下面是一个精心设计的工作示例:
梅因,加油
包干管
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
package main
type plugin string
func init() {
Rule = "b"
}
func (p plugin) String() string {
return string(p)
}
var Rule plugin
b、 go插件
package main
type plugin string
func init() {
Rule = "a"
}
func (p plugin) String() string {
return string(p)
}
var Rule plugin
package main
type plugin string
func init() {
Rule = "b"
}
func (p plugin) String() string {
return string(p)
}
var Rule plugin
但是,当我将插件更改为返回字符串“a”或“b”(不管是哪个插件,或者两者都返回)而不是p
时,它会加载错误的插件!i、 e
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
编辑:添加示例代码这是一个Golang错误(请参阅)
正如所指出的,解决方法是更改类型的名称,使每个插件具有不同的类型。这避免了碰撞。这是一个Golang错误(请参阅)
正如所指出的,解决方法是更改类型的名称,使每个插件具有不同的类型。这避免了冲突。显示一些代码。问题中链接了完整的源代码。不要期望每个人都去项目中查看每个文件,看看哪个部分不起作用,至少写一个例子来重现问题。当然,我将简短地给出一个更简单的示例。修复执行的方法是在每个插件中使用不同的类型,如
type pluginA string
和type pluginB string
,以防止类型冲突。显示一些代码。完整的源代码在问题中链接。不要期望每个人都去项目中查看每个文件,看看哪个部分不起作用,至少写一个例子来重现问题。当然,我将简短地给出一个更简单的示例修复执行的方法是在每个插件中使用不同的类型,如type pluginA string
和type pluginB string
,以防止类型冲突。