如何处理这种导入周期?

时间:2018-05-04 02:44:38

标签: go import cycle

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

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中清楚地理解这个问题吗?

2 个答案:

答案 0 :(得分:3)

您正在创建一个导入examplepkg的包otherpkg,当编译器读取此文件时,它将首先尝试在实际运行examplepkg内的代码之前解决导入。

问题是你的包otherpkg正在导入examplepkg,就像我之前说的那样,它会首先尝试解决导入问题。因此,编译器将返回examplepkg并尝试解决导入,但它会再次导致otherpkg

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

答案 1 :(得分:2)

两种方法:

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

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