Golang:发现实现接口的实例
在 Golang 中,通常需要对特定类型的实例或实现接口的实例执行操作一个特定的接口。然而,该语言的严格类型化在识别运行时满足给定标准的所有实例方面提出了挑战。
问题概述
考虑以下用例:
解决方案讨论
Golang 的类型系统不允许运行时检索所有实现接口的类型。这是因为 Go 是静态类型的,编译器会消除未使用的类型和方法来优化生成的二进制文件。
替代方法
另一种解决方案是维护全局将标识符与实现接口的实例相关联的映射或切片。每个结构体都可以通过向该全局集合添加实例来初始化自身。
例如:
<code class="go">var instMap = map[string]StartStopper type A struct {} func init() { instMap["A"] = new(A) }</code>
在启动和终止期间,程序可以迭代全局集合并调用适当的方法
多个实例的扩展
如果每种类型可以存在多个实例,则每当创建新实例并删除时,都必须更新全局集合它不再使用了。这确保了垃圾收集器的正确处理。
以上是如何在运行时动态发现实现Go接口的实例?的详细内容。更多信息请关注PHP中文网其他相关文章!