如何将接口转换为它实现的另一个接口?
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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

OpenSSL,作为广泛应用于安全通信的开源库,提供了加密算法、密钥和证书管理等功能。然而,其历史版本中存在一些已知安全漏洞,其中一些危害极大。本文将重点介绍Debian系统中OpenSSL的常见漏洞及应对措施。DebianOpenSSL已知漏洞:OpenSSL曾出现过多个严重漏洞,例如:心脏出血漏洞(CVE-2014-0160):该漏洞影响OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻击者可利用此漏洞未经授权读取服务器上的敏感信息,包括加密密钥等。

Go语言中用于浮点数运算的库介绍在Go语言(也称为Golang)中,进行浮点数的加减乘除运算时,如何确保精度是�...

Go爬虫Colly中的Queue线程问题探讨在使用Go语言的Colly爬虫库时,开发者常常会遇到关于线程和请求队列的问题。�...

本文讨论了GO中使用表驱动的测试,该方法使用测试用例表来测试具有多个输入和结果的功能。它突出了诸如提高的可读性,降低重复,可伸缩性,一致性和A

本文讨论了通过go.mod,涵盖规范,更新和冲突解决方案管理GO模块依赖关系。它强调了最佳实践,例如语义版本控制和定期更新。

本文讨论了GO的反思软件包,用于运行时操作代码,对序列化,通用编程等有益。它警告性能成本,例如较慢的执行和更高的内存使用,建议明智的使用和最佳
