我正在编写一个简单的应用程序,它以预定义的格式加载插件。示例插件如下:
package main
import (
"errors"
"fmt"
"strings"
)
var (
ok bool
InvConfig = errors.New("invalid config")
)
type Processor struct {
logEverything bool
}
func (p *Processor) Init(config map[string]interface{}) error {
p.logEverything, ok = config["log_everything"].(bool)
if !ok {
return InvConfig
}
return nil
}
func (p *Processor) Process(buf []byte) []byte {
if p.logEverything {
fmt.Printf("Shouter got data: %v\n", buf)
}
return []byte(strings.ToUpper(string(buf)))
}
func GetProcessor() *Processor {
return &Processor{}
}
我不太明白如何在我的主程序中加载这样的结构。因此,我声明了一个接口:
type Processor interface {
Init(map[string]interface{}) error
Process(buf []byte) []byte
}
然后我加载“getter”函数并尝试将其转换为返回接口的函数,以便调用它:
p, err := plugin.Open(filepath)
if err != nil {
logrus.Fatalf("Error opening plugin %s: %v", pluginName, err)
}
procGetterInter, err := p.Lookup("GetProcessor")
if err != nil {
logrus.Fatalf("Error loading processor getter for plugin %s: %v", pluginName, err)
}
procGetter, ok := procGetterInter.(func() interface{})
if !ok {
logrus.Fatalf("Error casting processor getter for plugin %s: %T", pluginName, procGetterInter)
}
但是演员失败并出现了错误:
Error casting processor getter for plugin simple_shout: func() *main.Processor
如果我从
GetProcessor
返回一个实例(而不是指针),尝试将该函数强制转换为返回Processor
的函数,我将得到相同的结果:Error casting processor getter for plugin simple_shout: func() main.Processor
如何从插件中获取结构体实例(因此加载返回它的函数)并断言它是我期望的接口?
更新:如果我从Processor接口中删除所有内容(即,它只成为一个空接口):
type Processor interface {}
请尝试将procGetterInter
转换为一个返回指向Processor
接口的指针的函数:
procGetter, ok := procGetterInter.(func() *Processor)
我仍然收到相同的错误提示:
plugin.Symbol is func() *main.Processor, not func() *main.Processor (types from different scopes)
为什么指向空接口的指针无法转换?
procGetter, ok := procGetterInter.(*ProcessorConstructor)
给出了相同的错误:为插件simple_shout转换处理器获取器时出错:func() *main.Processor
。 - pomo_mondreganto