首页 > 后端开发 > Golang > 正文

如何在运行时动态发现实现Go接口的实例?

Susan Sarandon
发布: 2024-10-29 05:51:31
原创
353 人浏览过

 How to Dynamically Discover Instances Implementing a Go Interface at Runtime?

Golang:发现实现接口的实例

在 Golang 中,通常需要对特定类型的实例或实现接口的实例执行操作一个特定的接口。然而,该语言的严格类型化在识别运行时满足给定标准的所有实例方面提出了挑战。

问题概述

考虑以下用例:

  • 接口 I 定义了两个方法:start() 和 stop()。
  • 多个结构体(A、B 和 C)实现接口 I。
  • 在程序启动期间,应在 A、B 和 C 的所有实例上调用 start()。
  • 同样,在程序终止期间,应在这些实例上调用 stop()。
  • 为了促进动态发现,最好不要在代码中硬编码结构体名称。

解决方案讨论

Golang 的类型系统不允许运行时检索所有实现接口的类型。这是因为 Go 是静态类型的,编译器会消除未使用的类型和方法来优化生成的二进制文件。

替代方法

另一种解决方案是维护全局将标识符与实现接口的实例相关联的映射或切片。每个结构体都可以通过向该全局集合添加实例来初始化自身。

例如:

<code class="go">var instMap = map[string]StartStopper

type A struct {}

func init() {
    instMap["A"] = new(A)
}</code>
登录后复制

在启动和终止期间,程序可以迭代全局集合并调用适当的方法

多个实例的扩展

如果每种类型可以存在多个实例,则每当创建新实例并删除时,都必须更新全局集合它不再使用了。这确保了垃圾收集器的正确处理。

以上是如何在运行时动态发现实现Go接口的实例?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板