gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:21:59 29 4
gpt4 key购买 nike

我正在写一个 Rules Engine在 golang 。我的测试涉及构建和加载两个插件,它们可以进行一些非常简单的字符串比较。我通过执行 fileglob 并调用 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

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

编辑:添加示例代码

最佳答案

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

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

关于Golang 1.8 plugin.Lookup 只加载第一个插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43978124/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com