Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reflection Golang-扫描类型为某物的所有结构_Reflection_Go - Fatal编程技术网

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

Reflection Golang-扫描类型为某物的所有结构,reflection,go,Reflection,Go,我是围棋初学者。多年来我用其他语言可能觉得太传统了,但以下是我在围棋中想做的。假设以下用例 我有接口I。这个接口有函数start()和stop() 有许多结构实现接口。结构A,结构B,结构C 当应用程序启动时,我想对结构A、B和C调用start() 类似地,当应用程序终止时,我想对A、B、C结构调用stop() 我不想在代码中的任何地方硬编码结构A、B和C来调用启动/停止函数。这样,当我稍后添加struct D(也实现了接口I)时,代码将自动工作,无需修改 为了实现这一点,我需要能够说“嘿,给我

我是围棋初学者。多年来我用其他语言可能觉得太传统了,但以下是我在围棋中想做的。假设以下用例

  • 我有接口I。这个接口有函数start()和stop()
  • 有许多结构实现接口。结构A,结构B,结构C
  • 当应用程序启动时,我想对结构A、B和C调用start()
  • 类似地,当应用程序终止时,我想对A、B、C结构调用stop()
  • 我不想在代码中的任何地方硬编码结构A、B和C来调用启动/停止函数。这样,当我稍后添加struct D(也实现了接口I)时,代码将自动工作,无需修改
  • 为了实现这一点,我需要能够说“嘿,给我实现接口I的所有类型”
  • 如果我得到a、B和C的一部分,我可以简单地循环并在正确的时间调用正确的方法

  • 在围棋中可行吗

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

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

    这意味着,除非某个类型(比如结构a)被引用并在某处使用,否则它将被省略

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

    这也不可能

    备选方案

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

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

    type A struct {}
    
    func init() {
        instMap["A"] = new(A)
    }
    
    然后,当您想要启动所有实例时,只需迭代映射并调用start()

    编辑


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

    您仍然需要每个结构的值才能调用该方法(该值可以是
    nil
    )。无法对类型(
    StructA.start()
    )调用方法。那么,是否希望此循环创建结构类型的nil值,然后调用方法
    start()
    ?我不是指调用结构本身,而是调用结构的实例。所以Go的要求可能是“给我所有你知道的接口实例”,我们可以从中得到一部分。不确定是否有办法。不是我所希望的——我想的是更具陈述性的风格。结构实现了一个接口,在程序的其他地方,我可以动态地进行簿记。随着映射的临近,init函数和映射之间的耦合非常紧密,这与映射无关。奇怪的是,我不知道有哪种语言可以让你找到由代码任意创建的类型的所有实例。一个例子是什么?@DavidBudworth我相信OP正在寻找依赖注入的方法。i、 他不一定对类型的特定内存实例感兴趣,而是希望扫描类型并基于某些条件进行实例化。例如,设想一个带有任务/动词等的命令行应用程序@DavidBudworth Little可以用C#或Java之类的语言通过反射实现。示例:这不起作用。仅当引用了相关文件时,才会调用init()函数
    type A struct {}
    
    func init() {
        instMap["A"] = new(A)
    }