第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

golang 插件可以用于工廠功能嗎?

golang 插件可以用于工廠功能嗎?

Go
喵喵時光機 2023-05-22 16:03:56
我在 golang 插件模塊中有以下代碼:即插即用package mainimport "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 mainimport (    "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, 并調(diào)用Say()它,但是第二個接口轉(zhuǎn)換出現(xiàn)混亂:first thing - 1panic: interface conversion: *main.thingFactory is not main.GetSayer: missing method Make即使運行時將第一個符號識別為 a,Sayer它也沒有識別出thingFactory顯然有一個 Make() 方法,該方法應該返回同樣是 Sayer 的東西。我在這里遺漏了一些明顯的東西嗎?
查看完整描述

2 回答

?
冉冉說

TA貢獻1877條經(jīng)驗 獲得超1個贊

第一個問題是在你的插件中thingFactory(更準確地說*thingfactory)沒有在你的主應用程序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

}

在此之后它仍然無法正常工作。這是因為插件的Sayer類型與您的主應用程序的類型不同Sayer。但它們必須相同才能實現(xiàn)您的主應用程序GetSayer界面。


一種解決方案是將接口“外包”Sayer給它自己的包,并在插件和主應用程序中使用這個通用的共享包。


讓我們創(chuàng)建一個新包,將其命名為subplay:


package subplay


type Sayer interface {

    Say() string

}

導入這個包并在插件中使用它:


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

}

并在主應用程序中導入和使用它:


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


查看完整回答
反對 回復 2023-05-22
?
呼喚遠方

TA貢獻1856條經(jīng)驗 獲得超11個贊

你的插件 Make 方法應該返回一個 Sayer 對象而不是東西


type Sayer interface {

    Say() string

}

func (t *thingFactory) Make(s string) Sayer {

    return New(s)

}


查看完整回答
反對 回復 2023-05-22
  • 2 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號