首頁 > 後端開發 > Golang > 主體

如何將介面轉換為它實現的另一個介面?

PHPz
發布: 2024-02-13 20:45:08
轉載
502 人瀏覽過

如何將介面轉換為它實現的另一個介面?

php小編草莓將為大家介紹如何將介面轉換為它實現的另一個介面。在程式設計中,介面是一種定義了一組方法的抽象類型,而另一個介面則是實作了這些方法的具體類型。將介面轉換為另一個介面可以幫助我們在不改變原有程式碼的情況下,擴充已有的功能。本文將詳細講解這個過程,並提供實例演示,幫助讀者更好地理解和應用這項技巧。

問題內容

簡而言之 - 我希望能夠將其底層類型實作特定介面的介面類型轉換為該特定介面。

我正在使用插件包來查找一個新函數,它看起來像這樣(我還有很多其他相同的函數):

func newdomainprimarykey() any { return domainprimarykey{} }
登入後複製

(這是在運行時生成的,因此我不能僅將其引用為 domainprimarykey)

我的查找和呼叫如下所示:

                plugin, err := plugin.open("my-plugin")
                if err != nil {
                    return err
                }

                symget, err := plugin.lookup("new" + pluginname)
                if err != nil {
                    return err
                }

                newgenmodel, ok := symget.(func() any)
                if !ok {
                    return errors.new("unexpected type from module symbol")
                }

                anygenmodel := newgenmodel()
                genmodel, ok := anygenmodel.(genmodel) // **this is where the problem is
                if !ok {
                    return errors.new("unexpected type from module symbol")
                }

                genmodelinstance := genmodel.get()
登入後複製

在上面,我嘗試將“anygenmodel”(一個接口)轉換為它實現的“genmodel”接口,但是,這不起作用。

我確信它實現了這個接口,因為當我執行以下操作時,我沒有收到任何錯誤。

type GenModel interface {
    Get() any
    TableName() string
}

var _ GenModel = (*DomainPrimaryKey)(nil) // this doesn't complain
登入後複製

我該怎麼做?我發現這篇文章不是我要找的,但看起來很像。

提前感謝您對此提供的任何幫助 - 這對我來說已經成為一個真正的障礙。

解決方法

如果底層類型實作這兩個接口,則非常簡單:

package main

import "fmt"

type IFace1 interface {
    DoThis()
}

type IFace2 interface {
    DoThat()
}

type impl struct{}

func (i *impl) DoThis() {
    fmt.Println("I implement IFace1")
}

func (i *impl) DoThat() {
    fmt.Println("I implement IFace2")
}

func GetIFace1() IFace1 {
    return &impl{}
}

func main() {
    i1 := GetIFace1()

    i1.DoThis()

    i2 := i1.(IFace2)

    i2.DoThat()
}
登入後複製

遊樂場

#如果您的程式碼不起作用,那麼我首先會質疑您的斷言,即 anygenmodel 的底層類型實際上實現了 genmodel 並從那裡開始工作。

以上是如何將介面轉換為它實現的另一個介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板