Golang 1.8插件.Lookup只加载第一个插件

时间:2017-05-15 11:18:43

标签: go

我在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

编辑:添加了示例代码

1 个答案:

答案 0 :(得分:0)

这是一个Golang错误(请参阅https://github.com/golang/go/issues/20376

正如Motakjuq所指出的,解决方法是更改​​类型的名称,以便每个插件具有不同的类型。这可以避免碰撞。