亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何使用 reflect 和 interface{} 在 Golang 中實現帶有參數的方法的

如何使用 reflect 和 interface{} 在 Golang 中實現帶有參數的方法的

Go
慕姐8265434 2022-08-24 15:46:32
我正在將一些代碼從C++移植到golang。我對golang中的OOP和多態性做了一些研究,都建議使用接口和嵌入來實現多態性。我有一個示例代碼,如下所示type Worker interface {    Show()    Inc()}type WorkerA struct {    x int    Worker // embed all methods in interface}type WorkerB struct {    WorkerA // embed WorkerA to have all methods}func (a *WorkerA) Inc() {    a.x++}func (a WorkerA) Show() {    fmt.Println("A:", a.x)}func (b WorkerB) Show() {    fmt.Println("B:", b.x)}func main() {    list := make([]Worker, 10)    for n:=0; n<len(list); n++ {        if n%2==0 {            list[n] = &WorkerA{}        } else {            list[n] = &WorkerB{WorkerA{}}        }    }    list[0].Inc()    list[1].Inc()    list[1].Inc()    list[2].Inc()    list[2].Inc()    list[2].Inc()    list[0].Show()    list[1].Show()    list[2].Show()在接口數組的幫助下,我可以在兩個 Worker 之間調用相應的方法和 'WorkerBAddx'''ShowWorkerA. Now I would like to add a third method call which add thefunc (a *WorkerA) Add(b WorkerA) {    a.x += b.x}我發現調用以下內容會導致錯誤之前是持有接口而不是結構listlist[0].Add(list[2])我在網上查找一些想法,看看可能有助于解決問題,這是我寫的reflectfunc callMethodParam(p interface{}, q interface{}) {    o := reflect.ValueOf(p)    m := reflect.ValueOf(q)    args:=[]reflect.Value{reflect.ValueOf(m)}    o.MethodByName("Add").Call(args)}callMethodParam(list[0], list[2])但這似乎也行不通。任何想法如何使它工作?謝謝。
查看完整描述

1 回答

?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

你問題的標題聽起來像是一個XY問題,但幸運的是,我們知道X,是嗎?


此外,代碼無法像示例中顯示的那樣工作,因為代碼被聲明為 切片并且沒有方法。list[0].Add(list[2])listWorkerWorkerAdd


但讓我們假裝它確實如此。鑒于 的實現需要訪問 一個 字段,您可以更改簽名以接受提供 的接口,并實現該接口:Add(b WorkerA)WorkerAxxWorkerA


type XProvider interface {

    X() int

}


func (a *WorkerA) X() int {

    return a.x

}


func (a *WorkerA) Add(b XProvider) {

    a.x += b.X()

}

然后在調用之前,使用類型斷言來確保(其中包含的類型)的特定實例也實現:a.AddWorkerXProvider


if xp, ok := list[2].(XProvider); ok {

    list[0].Add(xp)

}

這是一個更新的游樂場


查看完整回答
反對 回復 2022-08-24
  • 1 回答
  • 0 關注
  • 99 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號