Cycle d'importation non autorisé


135

J'ai un problème avec

cycle d'importation non autorisé

Il apparaît, lorsque j'essaye de tester mon contrôleur. Comme sortie, j'ai

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

Quelqu'un peut-il me dire, comment lire ou comprendre cette erreur? Où est la dépendance?


13
Le accountpackage importe le basepackage, qui importe le muxpackage, qui importe le accountpackage. C'est un ensemble cyclique de dépendances d'importation, ce qui n'est pas autorisé. Il semble que vous ayez également un autre cycle, les baseimportations mux, les importations routes, les importations base.
Amit Kumar Gupta

Réponses:


170

Voici une illustration de votre premier problème de cycle d'importation.

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

Comme vous pouvez le voir avec mon mauvais graphique ASCII, vous créez un cycle d' project/components/muximportation lors des importations project/controllers/account. Étant donné que Go ne prend pas en charge les dépendances circulaires, vous obtenez l' import cycle not allowederreur lors de la compilation.


10
Dommage que cela n'apparaisse que lors de la compilation. J'ai perdu beaucoup de temps à restructurer mon projet de trou juste pour voir que je n'ai pas le droit de faire ce que j'ai fait ... dafug ...
C4d

35
C'est l'une des raisons pour lesquelles je n'aime pas Go. Et ce n'est qu'une des douzaines de raisons.
tom10271

13
Autoriser les déps circulaires augmenterait considérablement les temps de compilation, car tout votre cercle de déps devrait être recompilé à chaque fois que l'un des déps est modifié. Avoir des profondeurs circulaires est également une lourde charge cognitive car il est plus difficile de raisonner sur votre programme et tend vers la complexité.
jmaloney

quel linter utilisez-vous je ne vois pas de peluchage sur vs code
Gopherine

Je peux voir cette erreur lors de l'exécution de l'application viawatcher
R Sun

98

Je viens de rencontrer ça. Vous pouvez accéder à une méthode / un type à partir du même package en utilisant le nom du package lui-même.

Voici un exemple pour illustrer ce que je veux dire:

Dans foo.go:

// foo.go
package foo

func Foo() {...}

Dans 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
À mon avis, c'est la meilleure réponse. La réponse acceptée est tout aussi valable, mais n'explique rien d'autre que la théorie d'un tel échec. La réponse de @Jonathan Lin explique cependant parfaitement ce message d'erreur cryptique et comment le combattre.
fantasitcalbeastly

3

Vous avez peut-être importé,

project/controllers/base

à l'intérieur de

project/controllers/routes

Vous avez déjà importé auparavant. Ce n'est pas pris en charge.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.