php editor Strawberry will introduce how to convert an interface into another interface it implements. In programming, an interface is an abstract type that defines a set of methods, while another interface is a concrete type that implements these methods. Converting an interface to another interface can help us extend existing functionality without changing the original code. This article will explain this process in detail and provide example demonstrations to help readers better understand and apply this technique.
In short- I want to be able to convert an interface type whose underlying type implements a specific interface to that specific interface.
I'm using the plugin package to find a new function and it looks like this (I have a lot of other identical functions):
func newdomainprimarykey() any { return domainprimarykey{} }
(This is generated at runtime so I can't just reference it as domainprimarykey)
My lookup and call looks like this:
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()
Above, I tried converting "anygenmodel" (an interface) to the "genmodel" interface it implements, however, this does not work.
I'm sure it implements this interface because when I do the following, I don't get any errors.
type GenModel interface { Get() any TableName() string } var _ GenModel = (*DomainPrimaryKey)(nil) // this doesn't complain
what should I do? I found this article which is not what I'm looking for but looks similar.
Thanks in advance for any help with this - this has become a real roadblock for me.
If the underlying type implements these two interfaces, it is very simple:
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() }
If your code doesn't work, then I would first question your assertion that the underlying type ofanygenmodel
actually implementsgenmodel
and work from there.
The above is the detailed content of How to convert an interface to another interface it implements?. For more information, please follow other related articles on the PHP Chinese website!