Golang - 扫描所有类型的结构

时间:2014-05-09 05:13:21

标签: reflection go

我是Go的初学者。我可能认为在其他语言中多年来都是传统的,但这就是我想要在Go中做的事情。假设以下用例

  1. 我有接口I.这个接口有函数,start()和stop()
  2. 实现接口的结构很多。 struct A,struct B,struct C
  3. 当应用程序启动时,我想在结构A,B和C
  4. 上调用start()
  5. 同样,当应用程序终止时,我想在A,B,C结构上调用stop()。
  6. 我不想在代码中的任何地方硬编码结构A,B和C来调用启动/停止功能。这样,当我稍后添加struct D(也实现接口I)时,代码将自动工作而无需修改。
  7. 为了达到这个目的,我需要能够说“嘿Go,给我所有实现接口I的类型”。
  8. 如果我回到A,B和C的片段,我可以简单地循环并在正确的时间调用正确的方法。
  9. Go可行吗?

1 个答案:

答案 0 :(得分:4)

简短的回答是:不,这是不可行的

Go是一种严格类型的语言。这允许链接器省略应用程序未使用的类型定义,方法和函数。

这意味着,除非在某处引用和使用类型(例如结构A),否则将省略它。

但是在你的评论中,你提到你不想要这些类型,而是想要实现该接口的任何类型的当前存在的实例

这也是不可能的。

<强>替代

我的建议是创建一个全局地图(或切片):

var instMap = map[string]StartStopper

让每个struct使用init函数向该映射添加一个实例,该函数将在应用程序的开头自动调用:

type A struct {}

func init() {
    instMap["A"] = new(A)
}

然后,当您想要启动所有实例时,只需遍历地图并调用Start()

修改

如果它不是每个类型的一个实例,而是每个类型的多个实例,那么无论何时创建新实例,您都必须添加到地图(或切片)。而且你不得不记得当它不再被使用时从地图上删除它,否则它不会被垃圾收集器处理。