如何应对这种进口周期?

How to deal with this kind of import cycle?

我是 Go 的新手,我陷入了一个导入周期,我不确定该如何解决。我有多个实现特定接口的 class。我还有另一个 class 将 return 对应于特定 class id 的接口。当任何特定的 class 需要使用我的另一个 class 时,问题就来了。这是一个例子:

package examplepkg

import otherpkg

type ExampleClass {}

func NewExampleClass() *ExampleClass {
    return &ExampleClass{}
}

func (ex *ExampleClass) ExampleMethod() { // Implements ExampleInterface
    var id int // Read from some external source
    theinterface := otherpkg.GetExampleInterface(id)
    theinterface.ExampleMethod()
}

以及另一个包中的函数:

package otherpkg

import examplepkg

func GetExampleInterface(id int) *ExampleInterface {
    switch id {
        case 3000: return examplepkg.NewExampleClass()
    }
}

如果您需要一些上下文,我正在从我没有创建的源中读取一些数据,这些数据使用 ID 封装了某种数据类型。例如:id somedata id2 somedata2。并使用特定的 id,我可以调用该方法来获取良好的数据类型和大小。它们可以嵌套,这就是为什么我使用相同的方法 ExampleMethod()。

谁能帮我在 Go 中清楚地理解这个问题?

您正在创建一个导入 otherpkg 的包 examplepkg,当编译器读取此文件时,它会先尝试解决导入问题,然后再实际 运行 里面的代码 examplepkg.

问题是您的包 otherpkg 正在导入 examplepkg 并且正如我之前所说,它将首先尝试解决导入问题。因此,编译器将返回 examplepkg 并尝试解决导入问题,但它会再次导致 otherpkg.

这会导致您面临导入周期。此问题的一种解决方案是创建一个新包,在其中声明类型 ExampleClass 并声明 func NewExampleClass。然后让 examplepkgotherpkg 从这个新创建的包中导入,打破你现在面临的导入周期。

两种解决方法:

  1. 创建一个包含两者共有功能的新包,然后在两个包中导入该包。

  2. 考虑是否所有这些都属于同一个包,而不是两个不同的包。