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