gpt4 book ai didi

reflection - Golang - 扫描所有类型的结构

转载 作者:IT王子 更新时间:2023-10-29 00:42:35 24 4
gpt4 key购买 nike

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

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

在 Go 中可行吗?

最佳答案

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

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

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

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

这也是不可能的。

备选

我的建议是创建一个全局 map (或 slice ):

var instMap = map[string]StartStopper

并让每个结构向该映射添加一个实例,该实例带有一个初始化函数,该函数将在应用程序启动时自动调用:

type A struct {}

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

然后当你想启动所有实例时,只需遍历 map 并调用 Start()

编辑

如果不是每种类型一个实例的情况,而是每种类型的多个实例,那么无论何时创建新实例,您都必须添加到映射(或 slice )中。当不再使用实例时,您必须记住从映射中删除该实例,否则垃圾收集器将不会处理它。

关于reflection - Golang - 扫描所有类型的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23557048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com