当前位置: 首页 > 面试题库 >

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

缑智敏
2023-03-14
问题内容

我是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 = html" target="_blank">map[string]StartStopper

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

type A struct {}

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

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

编辑

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



 类似资料:
  • 我正在尝试从我的GAE应用程序中的数据存储中删除某个类型的所有实体。我有以下一行: 我看到以下例外情况: 我假设我没有正确地进行别名操作,因为它误将DELETE当作一个实际的类。我尝试在没有别名的情况下只执行操作,但似乎不起作用。

  • 我想从我的api发送一个响应,所有响应都有一个统一的结构 我希望数据能够成为不同的结构,而不仅仅是单个数据结构。我可以说我没有正确使用这种模式。完成这种事情的正确方法是什么?有没有办法让结构字段能够成为具有相同键的任何类型?

  • 我制作了一个简单的程序,根据公式中的3个数字计算增量。但是,小数点后的分数和数字(如3.33、3/4)有问题。如果我将其替换为任何字母,则会出现错误: 线程“main”java中出现异常。util。java上的InputMismatchException。base/java。util。扫描仪。throwFor(Scanner.java:939)访问java。base/java。util。扫描仪。下

  • 问题内容: 当我运行下面的代码片段时,它会引发错误 a.test未定义(类型interface {}是没有方法的接口) 看来类型开关没有生效。 如果我将其更改为 没关系 问题答案: 这是规范(强调我的)定义的正常行为: TypeSwitchGuard可以包含一个简短的变量声明。使用该格式时,将在每个子句中隐式块的开头声明变量。 在大小写正好列出一种类型的子句中,变量具有该类型。 否则,变量具有Ty

  • 问题内容: 我有以下几种类型: 我可以使用use ,但是我 不能 使用 似乎可以嵌入语法,但是使用它无效吗? 问题答案: 嵌入式类型是(未命名的)字段,由不合格的类型名称引用。 规格:结构类型: 使用类型但没有显式字段名称声明的字段是 匿名字段 ,也称为 嵌入式 字段或该类型在结构中的嵌入。必须将嵌入式类型指定为类型名称或指向非接口类型名称的指针,并且本身不能为指针类型。 非限定类型名称充当字段名

  • 背景:我对编码非常陌生。我正在写一个基于文本的单人RPG作为学习方法。 所以,我有一个ArrayList,我用它来存储项目类的对象。我想根据扫描仪的用户输入检查ArrayList是否存在项目(项目类中的对象)。 如果可能的话,我认为如果我将一个项目传递给开关(基于用户输入),而不是一个字符串,而我后来必须“翻译”ArrayList才能使用它,那会更干净。 可能吗?或者我必须按照我在下面代码中写出来