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

  • 我有接口I。此接口具有功能start()和stop()
  • 有许多实现接口的结构。结构A,结构B,结构C
  • 当应用程序启动时,我想在结构A,B和C上调用start()
  • 同样,当应用程序终止时,我想在A,B,C结构上调用stop()。
  • 我不想在代码中的任何地方硬编码结构A,B和C来调用启动/停止功能。这样一来,当我以后添加struct D(也实现接口I)时,代码将自动运行而无需修改。
  • 为了实现这一点,我需要能够说"嘿,给我实现接口I的所有类型"。
  • 如果我得到A,B和C的一部分,我可以简单地循环遍历并在正确的时间调用正确的方法。
  • 在Go中可行吗?


    简短的答案是:不,那是行不通的

    Go是严格输入的语言。这使链接器可以省去应用程序未使用的类型定义,方法和函数。

    这意味着,除非在某处引用并使用了某个类型(例如struct A),否则将省略该类型。

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

    这也不可能。

    另类

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

    并让每个结构体使用init函数向该映射添加实例,该init函数将在应用程序启动时自动调用:

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

    编辑

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