我对Go很陌生,我陷入了导入周期,不确定如何解决。我有多个实现特定接口(interface)的类。我还有另一个类,它将返回对应于特定类ID的接口(interface)。当任何特定的类(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中清楚地理解此问题?

最佳答案

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

问题是您的软件包otherpkg正在导入examplepkg,就像我之前说的,它将首先尝试解决导入问题。因此,编译器将返回examplepkg并尝试解决导入问题,但它将再次将其引导至otherpkg

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

09-25 22:04