Ciclo de importação não permitido


135

Estou com um problema

ciclo de importação não permitido

Aparece quando estou tentando testar meu controlador. Como saída eu tenho

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

Alguém pode me dizer como ler ou entender esse erro? Onde está a dependência errada?


13
O accountpacote importa o basepacote, que importa o muxpacote, que importa o accountpacote. Esse é um conjunto cíclico de dependências de importação, o que não é permitido. Parece que você também tem outro ciclo, baseimportações mux, quais importações routes, quais importações base.
Amit Kumar Gupta

Respostas:


169

Aqui está uma ilustração do seu primeiro problema no ciclo de importação.

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

Como você pode ver no meu gráfico ASCII ruim, você está criando um ciclo de project/components/muximportação quando importa project/controllers/account. Como o Go não suporta dependências circulares, você recebe o import cycle not allowederro durante o tempo de compilação.


9
Tão ruim que isso aparece apenas na compilação. Desperdiçado muito tempo para reestruturar o meu projecto buraco só para ver que eu não estou autorizado a fazer o que eu fiz ... dafug ...
C4d

35
Esta é uma das razões pelas quais eu não gosto de Go. E é apenas uma dentre uma dúzia de razões.
precisa saber é o seguinte

13
Permitir depósitos circulares aumentaria significativamente o tempo de compilação, pois todo o seu círculo precisaria ser recompilado toda vez que um deles fosse alterado. Ter deps circulares também é uma carga cognitiva pesada, pois dificulta o raciocínio sobre o programa e tende à complexidade.
jmaloney

que linter você está usando eu não vejo qualquer linting em vs código
Gopherine

Eu posso ver esse erro ao executar o aplicativo através dewatcher
R Sun

98

Acabei de encontrar isso. Você pode estar acessando um método / tipo de dentro do mesmo pacote usando o próprio nome do pacote.

Aqui está um exemplo para ilustrar o que quero dizer:

Em foo.go:

// foo.go
package foo

func Foo() {...}

Em 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
Na minha opinião, esta é a melhor resposta. A resposta aceita é igualmente válida, mas não explica nada além da teoria para esse fracasso. A resposta de Jonathan Lin, no entanto, explica perfeitamente essa mensagem de erro enigmática e como combatê-la.
Fantasitcalbeastly # 11/18

3

Você pode ter importado,

project/controllers/base

dentro de

project/controllers/routes

Você já importou antes. Isso não é suportado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.