我是 Go 的初学者。我可能认为多年来使用其他语言过于传统,但这就是我想在 Go 中做的事情。假设以下用例
- 我有接口 I。该接口有函数 start() 和 stop()
- 有许多结构体实现该接口。结构体A、结构体B、结构体C
- 当应用程序启动时,我想在结构 A、B 和 C 上调用 start()
- 同样,当应用程序终止时,我想对 A、B、C 结构调用 stop()。
- 我不想在代码中的任何位置硬编码 struct A、B 和 C 来调用启动/停止函数。这样当我稍后添加struct D(也实现接口I)时,代码将自动工作而无需修改。
- 为了实现这一点,我需要能够说“嘿,给我所有实现接口 I 的类型”。
- 如果我取回 A、B 和 C 的切片,我可以简单地循环并在正确的时间调用正确的方法。
在 Go 中可行吗?
简短的回答是:不,那是不可能的
Go 是一种严格类型语言。这允许链接器省略应用程序不使用的类型定义、方法和函数。
这意味着,除非某个类型(例如 struct A)在某处被引用和使用,否则它将被省略。
但在您的评论中,您提到您不需要类型,而是当前现有的实例实现该接口的任何类型。
这也是不可能的。
选择
我的建议是创建一个全局地图(或切片):
var instMap = map[string]StartStopper
并让每个结构体使用 init 函数向该映射添加一个实例,该函数将在应用程序启动时自动调用:
type A struct {}
func init() {
instMap["A"] = new(A)
}
然后,当您想要启动所有实例时,只需迭代地图并调用 Start()
Edit
如果不是每种类型一个实例的情况,而是每种类型有多个实例,那么每当创建新实例时,您都必须添加到映射(或切片)中。并且您必须记住在不再使用实例时从地图中删除该实例,否则垃圾收集器将不会处理它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)