一尘不染

Golang-扫描某种类型的所有结构

go

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

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

在Go中可行吗?


阅读 362

收藏
2020-07-02

共1个答案

一尘不染

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

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

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

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

这也不可能。

另类

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

var instMap = map[string]StartStopper

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

type A struct {}

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

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

编辑

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

2020-07-02