我是Go语言的初学者。我可能认为多年以来其他语言都太传统了,但这就是我想在Go中做的事情。假设以下用例
在Go中可行吗?
简短的答案是:不,那是行不通的
Go是一种严格类型的语言。这使链接器可以省去应用程序未使用的类型定义,方法和函数。
这意味着,除非在某处引用并使用了某个类型(例如struct A),否则将省略该类型。
但是在您的评论中,您提到您不想要类型,而是想要实现接口的任何类型的当前 实例 。
这也不可能。
另类
我的建议是创建一个全局地图(或切片):
var instMap = map[string]StartStopper
并让每个结构体使用init函数向该映射添加实例,该init函数将在应用程序开始时自动调用:
type A struct {} func init() { instMap["A"] = new(A) }
然后,当您要启动所有实例时,只需遍历地图并调用Start()
编辑
如果不是每种类型一个实例,而是每种类型都有多个实例,那么每当创建一个新实例时,您都必须将其添加到地图(或切片)中。而且,您将不得不记住当不再使用实例时,将从地图中删除该实例,否则该实例将不会被垃圾收集器处理。