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 - 扫描某类型的所有结构 的相关文章

  • 使用反射更改布尔字符串值不起作用

    我正在尝试 Java 反射和内联字符串 并得出了令我困惑的结果 import java lang reflect Field public class HappyDebugging public static void main Strin
  • GO并发编程测试

    我试图确保我的并发程序不存在以下情况 僵局 livelock 饥饿 我找到了以下工具http blog golang org race detector http blog golang org race detector 我尝试编译并运行
  • 使用 crypto/ssh 的 golang scp 文件

    我正在尝试通过 ssh 下载远程文件 以下方法在 shell 上运行良好 ssh hostname tar cz opt local folder gt folder tar gz 然而 golang 上的相同方法在输出工件大小方面存在一些
  • 如何在 Goji (Golang) 中使用不同的中间件创建单独的路由组?

    我正在使用Goji https github com zenazn goji https github com zenazn goji 并希望定义具有自己的中间件的路由组 例如 下面的所有路径 company应使用 LDAP 身份验证并定义
  • 共享来自单独命令/进程的属性

    我提供带有多个命令和子命令的命令行工具 我使用cobra https github com spf13 cobra命令行 我有两个单独的命令首先是前提条件e 给其他人 例如第一个命令是通过创建临时文件夹并验证某些文件来首选环境 第二个命令应
  • 如何有效地测试action是否用属性(AuthorizeAttribute)修饰?

    我正在使用 MVC 并且有一种情况OnActionExecuting 我需要确定即将执行的Action方法是否用属性修饰 AuthorizeAttribute尤其 我不是问授权是否成功 失败 而是问该方法是否需要授权 对于非 MVC 人员
  • 改进绩效反思 - 我应该考虑哪些替代方案?

    我需要动态地设置对象上的一堆或属性的值 将其称为传输对象 将在短时间内创建相当数量的此类传输对象并设置其属性 我想避免使用反射 还有其他选择吗 如果是的话 有我可以查看的示例实现吗 Use Delegate CreateDelegate h
  • 无法连接到代理“证书由未知机构签名”

    我正在尝试通过 Kubernetes 部署上的 cloudsql proxy 容器连接到 CloudSQL 实例 我已安装 cloudsql 凭据以及值GOOGLE APPLICATION CREDENTIALS set 但是 我的日志中仍
  • 按引用或按值扫描功能

    我有以下代码 statement SELECT id from source where mgmt 1 var exists string errUnique dr db QueryRow statement mgmt Scan exist
  • 将 python 'type' 对象转换为字符串

    我想知道如何使用 python 的反射功能将 python 类型 对象转换为字符串 例如 我想打印一个对象的类型 print My type is type some object which obviously doesn t work
  • 完全删除使用“go get”安装的软件包?

    我正在使用 Go 1 13 1 最新版本 我正在尝试完全删除我安装的软件包go get来自 GitHub 这go clean i
  • 错误“binary.Write:无效类型”是什么意思?

    下面显示的代码 我创建了一个结构类型并希望将其编码为二进制 但它显示binary Write invalid type main Stu错误 我读过一些类似的代码 但我找不到为什么我的代码不起作用 type Stu struct Name
  • 使用 OpenTelemetry 统一不同服务的范围

    我刚刚开始使用 OpenTelemetry 并为此创建了两个 微 服务 Standard and GeoMap 最终用户将请求发送到Standard服务 该服务又将请求发送到GeoMap在将结果返回给最终用户之前获取信息 我使用 gRPC
  • C# 反射属性顺序

    我正在使用代码https stackoverflow com a 531388 528131 https stackoverflow com a 531388 528131要成功地从基类中检索对象实例的所有属性 问题在于首先要迭代派生类型的
  • 重新插入通道导致死锁

    我有稳定的入站 作业 流 将其输入到无缓冲通道中 我有一个for range循环来迭代项目并处理它们 如果处理该项目失败 我会将项目重新插入通道中 以便稍后重试 问题是当我将项目重新插入通道时 它陷入僵局 我明白为什么会发生这种情况 处理器
  • Golang中如何获得100%的代码覆盖率? [复制]

    这个问题在这里已经有答案了 我无法获得 100 的代码覆盖率 因为我无法在 Golang 中测试 Fatals 我发现了一些问答 包括this one https stackoverflow com questions 30688554 h
  • 获取枚举实例的名称[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 假设我有这个枚举 public enum MyEnum ValueOne 1 ValueTwo 2 ValueThree 3 然后
  • 指示泛型返回动态类型的对象

    这个问题是我原来问题的后续问题here https stackoverflow com questions 2541184 using a type object to create a generic 假设我有以下泛型类 简化 class
  • 如何使用 KClass 反射在 Kotlin 中区分类和接口

    我正在使用 Kotlins KClass 按名称查找类 如下所示 val i KClass lt gt Class forName SampleClass kotlin 但是 我想省略接口 到目前为止 我通过构造函数区分接口和类 val i
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static

随机推荐