2 回答

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超1個(gè)贊
第一個(gè)問(wèn)題是在你的插件中thingFactory(更準(zhǔn)確地說(shuō)*thingfactory)沒(méi)有在你的主應(yīng)用程序GetSayer界面中描述的方法:
Make(string) Sayer
你有:
Make(string) thing
所以(首先)你必須改成thingFactory.Make()這樣:
type Sayer interface {
Say() string
}
func (t thingFactory) Make(s string) Sayer {
th := New(s)
return &th
}
在此之后它仍然無(wú)法正常工作。這是因?yàn)椴寮腟ayer類型與您的主應(yīng)用程序的類型不同Sayer。但它們必須相同才能實(shí)現(xiàn)您的主應(yīng)用程序GetSayer界面。
一種解決方案是將接口“外包”Sayer給它自己的包,并在插件和主應(yīng)用程序中使用這個(gè)通用的共享包。
讓我們創(chuàng)建一個(gè)新包,將其命名為subplay:
package subplay
type Sayer interface {
Say() string
}
導(dǎo)入這個(gè)包并在插件中使用它:
package main
import (
"fmt"
"path/to/subplay"
)
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) subplay.Sayer {
th := New(s)
return &th
}
并在主應(yīng)用程序中導(dǎo)入和使用它:
package main
import (
"fmt"
"path/to/subplay"
"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.(subplay.Sayer)
fmt.Println(thing.Say())
symbol, err = p.Lookup("ThingFactory")
if err != nil {
panic(err)
}
factory := symbol.(GetSayer)
madeThing := factory.Make("how about me?")
fmt.Println(madeThing.Say())
fmt.Println(madeThing.Say())
}
type GetSayer interface {
Make(string) subplay.Sayer
}
現(xiàn)在它可以工作了,輸出將是:
first thing - 1
how about me? - 1
how about me? - 2

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊
你的插件 Make 方法應(yīng)該返回一個(gè) Sayer 對(duì)象而不是東西
type Sayer interface {
Say() string
}
func (t *thingFactory) Make(s string) Sayer {
return New(s)
}
- 2 回答
- 0 關(guān)注
- 143 瀏覽
添加回答
舉報(bào)