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中文網其他相關文章!