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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

Go
喵喵時(shí)光機(jī) 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 對(duì)象并在另一個(gè)程序中使用:主程序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()它,但是第二個(gè)接口轉(zhuǎn)換出現(xiàn)混亂:first thing - 1panic: interface conversion: *main.thingFactory is not main.GetSayer: missing method Make即使運(yùn)行時(shí)將第一個(gè)符號(hào)識(shí)別為 a,Sayer它也沒(méi)有識(shí)別出thingFactory顯然有一個(gè) Make() 方法,該方法應(yīng)該返回同樣是 Sayer 的東西。我在這里遺漏了一些明顯的東西嗎?
查看完整描述

2 回答

?
冉冉說(shuō)

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


查看完整回答
反對(duì) 回復(fù) 2023-05-22
?
呼喚遠(yuǎn)方

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)

}


查看完整回答
反對(duì) 回復(fù) 2023-05-22
  • 2 回答
  • 0 關(guān)注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)