登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-10 18:21:34 454浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《Golang - 扫描某类型的所有结构》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

我是 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 中可行吗?


解决方案


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

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

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

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

这也是不可能的。

替代方案

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

var instmap = map[string]startstopper

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

type A struct {}

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

然后,当您想要启动所有实例时,只需迭代地图并调用 start()

编辑

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

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Golang - 扫描某类型的所有结构》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>