我是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中清楚地理解这个问题吗?
答案 0 :(得分:3)
您正在创建一个导入examplepkg
的包otherpkg
,当编译器读取此文件时,它将首先尝试在实际运行examplepkg
内的代码之前解决导入。
问题是你的包otherpkg
正在导入examplepkg
,就像我之前说的那样,它会首先尝试解决导入问题。因此,编译器将返回examplepkg
并尝试解决导入,但它会再次导致otherpkg
。
这会导致您面临的导入周期。此问题的一个解决方案是创建一个新包,在其中声明类型ExampleClass
并声明func NewExampleClass
。然后从这个新创建的包导入examplepkg
和otherpkg
,打破您现在面临的导入周期。
答案 1 :(得分:2)
两种方法:
创建一个新包,其中包含两者共有的功能,然后在两个包中导入该包。
考虑所有这些是否属于同一个包而不是两个不同的包。