我在 golang 插件模块中有以下代码:
即插即用
package main
import "fmt"
var (
Thing = New("first thing")
ThingFactory = thingFactory{}
)
type thing struct {
i int
s string
}
func New(s string) thing {
return thing{s: s}
}
func (t *thing) Say() string {
t.i++
return fmt.Sprintf("%s - %d", t.s, t.i)
}
type thingFactory struct{}
func (t thingFactory) Make(s string) thing {
return New(s)
}
它被编译为 .so 对象并在另一个程序中使用:
主程序
package main
import (
"fmt"
"plugin"
)
func main() {
p, err := plugin.Open("../plug/plug.so")
if err != nil {
panic(err)
}
symbol, err := p.Lookup("Thing")
if err != nil {
panic(err)
}
thing := symbol.(Sayer)
fmt.Println(thing.Say())
symbol, err = p.Lookup("ThingFactory") // <-problems start here
if err != nil {
panic(err)
}
factory := symbol.(GetSayer)
madeThing := factory.Make("how about me?")
fmt.Println(madeThing.Say())
fmt.Println(madeThing.Say())
}
type Sayer interface {
Say() string
}
type GetSayer interface {
Make(string) Sayer
}
我能够查找Thing, 并调用Say()它,但是第二个接口转换出现混乱:
first thing - 1
panic: interface conversion: *main.thingFactory is not main.GetSayer: missing method Make
即使运行时将第一个符号识别为 a,Sayer它也没有识别出thingFactory显然有一个 Make() 方法,该方法应该返回同样是 Sayer 的东西。
我在这里遗漏了一些明显的东西吗?
万千封印
蝴蝶刀刀
相关分类