不允许导入周期


135

我有一个问题

不允许导入周期

当我尝试测试控制器时,它会出现。作为输出,我有

can't load package: import cycle not allowed
package project/controllers/account
    imports project/controllers/base
    imports project/components/mux
    imports project/controllers/account
import cycle not allowed
package project/controllers/account
    imports project/controllers/base
    imports project/components/mux
    imports project/controllers/account
import cycle not allowed
package project/controllers/account
    imports project/controllers/base
    imports project/components/mux
    imports project/controllers/routes
    imports project/controllers/base

有人可以告诉我如何阅读或理解此错误吗?依赖关系哪里出问题了?


13
account包装进口base包,其中进口的mux包装,其中进口的account包。这是导入依赖的周期性集合,这是不允许的。看来您还有另一个循环,即import (base进口mux)和import routes(进口)base
阿米特·库玛·古普塔

Answers:


169

这是第一个导入周期问题的说明。

                  project/controllers/account
                     ^                    \    
                    /                      \
                   /                        \ 
                  /                         \/
         project/components/mux <--- project/controllers/base

你可以用我的坏ASCII图表看是要创建一个导入周期时project/components/mux进口project/controllers/account。由于Go不支持循环依赖关系,因此您会import cycle not allowed在编译期间收到错误消息。


9
太糟糕了,这只能在编译时显示。浪费了很多时间来重组我的Hole项目,只是为了看看我不允许做我所做的事情... dafug ...
C4d

35
这是我不喜欢Go的原因之一。这只是十分之一的原因。
tom10271 '18 -10-2

12
允许循环dep会大大增加编译时间,因为每次dep之一更改时,整个dep循环都需要重新编译。拥有循环侦探也是一个沉重的认知负担,因为它使您难以对程序进行推理,并且趋向于复杂。
jmaloney

您使用的是哪一个
linter,

通过watcher
R Sun

98

我刚遇到这个。您可能正在使用包名称本身从同一包中访问方法/类型。

这是一个例子来说明我的意思:

在foo.go中:

// foo.go
package foo

func Foo() {...}

在foo_test.go中:

// foo_test.go
package foo

// try to access Foo()
foo.Foo() // WRONG <== This was the issue. You are already in package foo, there is no need to use foo.Foo() to access Foo()
Foo() // CORRECT

6
我认为这是更好的答案。公认的答案同样有效,但是除了这种失败的理论外,没有其他解释。但是,@ Jonathan Lin的答案完美地解释了这个错误的错误消息,以及如何解决它。
fantasitcalbeastly

3

您可能已经导入,

project/controllers/base

在 - 的里面

project/controllers/routes

您之前已经导入。不支持。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.