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

2023-11-25

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

  1. 我有接口 I。该接口有函数 start() 和 stop()
  2. 有许多结构体实现该接口。结构体A、结构体B、结构体C
  3. 当应用程序启动时,我想在结构 A、B 和 C 上调用 start()
  4. 同样,当应用程序终止时,我想对 A、B、C 结构调用 stop()。
  5. 我不想在代码中的任何位置硬编码 struct 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()

Edit

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Golang - 扫描某类型的所有结构 的相关文章

  • 为什么结构体不能转换为嵌入类型

    package main type Inner struct x int type Outer struct Inner func main x Inner 1 y Outer x cannot convert x type Inner t
  • C# 反射和获取属性

    我有以下虚拟类结构 我试图找出如何从 PeopleList 中 People 类的每个实例获取属性 我知道如何从 People 的单个实例中获取属性 但我无法弄清楚如何从 PeopleList 中获取它 我确信这真的很简单 但有人能指出我正
  • 为什么 C# 中没有“fieldof”或“methodof”运算符? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 它们可以如下使用 FieldInfo field fieldof string Empty MethodInfo method1 methodo
  • 私有方法真的安全吗?

    在Java中private访问修饰符被认为是安全的 因为它在类外部不可见 那么外界也不知道这个方法 但我认为Java反射可以用来打破这个规则 考虑以下情况 public class ProtectedPrivacy private Stri
  • 如何使用golang中通过引用传递的索引访问切片中的元素

    我将切片的引用传递给函数 并且我正在函数内的切片中进行更改 我还尝试使用索引访问切片中的元素 它在 golang 中抛出异常 通过引用传递的索引访问切片中的元素的最佳方法是什么 您可以在此处找到示例代码 参考 http www reddit
  • 如何通过模板中的变量访问对象字段?

    我有一个嵌套循环 columns columns range dx dataList range c columns index dx c end end dataList是orm模型数组 和ID Title字段 那么columns is
  • 如何使用 mongo-go-driver 有效地将 bson 转换为 json?

    我想将 bson 转换为mongo go 驱动程序 https github com mongodb mongo go driver有效地转换为 json 我应该小心处理NaN 因为json Marshal失败如果NaN存在于数据中 例如
  • 无需时间即可生成随机字符串?

    我知道如何使用 Runes 和播种 rand Init 在 go 中生成随机字符串time UnixNano 我的问题是 是否可以 使用 stdlib 在不使用当前时间戳 安全 的情况下播种 rand 此外 我问 因为仅仅依靠时间来为敏感操
  • Go中如何从json字符串中获取键值

    我想尝试从 Go 中的 JSON 获取键值 但我不确定如何操作 我已经能够使用 simplejson 读取 json 值 但是我无法找到如何获取键值 有人能指出我正确的方向和 或帮助我吗 谢谢你 您可以通过执行以下操作来获取 JSON 结构
  • 从 []byte 到 char*

    我想包装一个 C 函数 它需要一个char 指向非空字节缓冲区 的第一个元素 我正在尝试使用 CGo 将其包装在 Go 函数中 以便我可以将其传递给 byte 但我不知道如何进行转换 C 函数签名的简化版本是 void foo char c
  • 在 Go 中跟踪 HTTP 请求时指定超时

    我知道通过执行以下操作来指定 HTTP 请求超时的常用方法 httpClient http Client Timeout time Duration 5 time Second 但是 我似乎不知道在跟踪 HTTP 请求时如何执行相同的操作
  • .Net 中是否有一个框架属性可以隐藏成员以使其免受反射?

    是否有一个属性可以隐藏成员 特别是属性 typeof MyType GetProperties 在 net中 我正在寻找快速修复方法 即不创建自定义属性等 thanks No 反射允许人们看到一切 包括标记为私有的成员 最终反射使用与 CL
  • 是否可以获取有关 Golang 中调用者函数的信息?

    是否可以获取有关 Golang 中调用者函数的信息 例如 如果我有 func foo Do something func main foo 我怎样才能得到那个foo已被呼叫来自main 我可以用其他语言实现这一点 例如在 C 中我只需要使用
  • for 循环初始值设定项中的结构

    知道为什么 for 循环初始值设定项中的这个结构表达式在编译时会出现语法错误吗 在这种情况下 指向结构的指针工作正常 但 ofc 我需要如下所示的局部变量 感谢您的建议 type Request struct id int line byt
  • 当参数为泛型时,Type.GetMethod 的类型数组中应包含哪些类型?

    如果我想通过反射调用泛型方法 我可以轻松使用this https stackoverflow com questions 232535 how to use reflection to call generic method技术 除非 该方
  • Golang 正则表达式命名组和子匹配

    我正在尝试匹配正则表达式并获取匹配的捕获组名称 当正则表达式仅与字符串匹配一次时 这是有效的 但如果它与字符串匹配多次 SubexpNames不返回重复的名称 这是一个例子 package main import fmt regexp fu
  • 使用 HTTPS GRC 从 AWS Codecommit 获取私有存储库

    我正在尝试导入位于 AWS codecommit 中的模块 为了克隆存储库 我使用 HTTPS GRC Git 远程代码提交 方法 该方法使用 Google Suite 凭证来访问 AWS 控制台 我用来克隆存储库的命令是 git clon
  • 如何在 Go 中将环境变量传递给测试用例

    在为 Go 编写测试用例时 传递需要提供给测试的环境变量的标准方法是什么 例如 我们不想在测试用例的源代码中嵌入密码 处理这个问题最标准的方法是什么 我们让测试用例寻找配置文件吗 还有别的事吗 看来我偶然发现了答案 将其添加到测试用例中可以
  • 为什么 Go 禁止取 (&) 映射成员的地址,却允许取 (&) 切片元素?

    Go 不允许获取地图成员的地址 if I do this p mm abc Syntax Error cannot take the address of mm abc 理由是 如果 Go 允许使用此地址 那么当地图后台存储增长或缩小时 该
  • 尽管我可以在 DefinedTypes 中看到该类,但 Assembly.CreateInstance 返回 null

    我使用以下方法加载新的程序集并将类的实例创建到新的 AppDomain 中 private static object CreateInstanceFromBinary AppDomain appDomain string typeName

随机推荐