Importzyklus nicht erlaubt


135

Ich habe ein Problem mit

Importzyklus nicht erlaubt

Es wird angezeigt, wenn ich versuche, meinen Controller zu testen. Als Ausgabe habe ich

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

Kann mir jemand sagen, wie man diesen Fehler liest oder versteht? Wo ist die Abhängigkeit falsch?


13
Das accountPaket importiert das basePaket, das das Paket importiert , das das muxPaket importiert account. Dies ist ein zyklischer Satz von Importabhängigkeiten, der nicht zulässig ist. Es sieht so aus, als hätten Sie auch einen anderen Zyklus: baseImporte mux, welche Importe routes, welche Importe base.
Amit Kumar Gupta

Antworten:


169

Hier ist eine Illustration Ihres ersten Importzyklusproblems.

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

Wie Sie an meinem schlechten ASCII-Diagramm sehen können, erstellen Sie beim project/components/muxImportieren einen Importzyklus project/controllers/account. Da Go keine zirkulären Abhängigkeiten unterstützt, wird der import cycle not allowedFehler während der Kompilierungszeit angezeigt.


9
So schlimm, dass dies nur beim Kompilieren angezeigt wird. Ich habe viel Zeit für die Umstrukturierung meines gesamten Projekts verschwendet, nur um zu sehen, dass ich nicht das tun darf, was ich getan habe ... dafug ...
C4d

35
Dies ist einer der Gründe, warum ich Go nicht mag. Und das ist nur einer von zwölf Gründen.
Tom10271

12
Das Zulassen von kreisförmigen Deps würde die Kompilierungszeiten erheblich verlängern, da Ihr gesamter Kreis von Deps jedes Mal neu kompiliert werden müsste, wenn sich eine der Deps ändert. Zirkuläre Deps zu haben, ist auch eine schwere kognitive Belastung, da es schwieriger ist, über Ihr Programm nachzudenken, und zu Komplexität neigt.
Jmaloney


Ich kann diesen Fehler sehen, während ich die App durchlaufewatcher
R So

98

Ich bin gerade darauf gestoßen. Möglicherweise greifen Sie innerhalb desselben Pakets mit dem Paketnamen selbst auf eine Methode / einen Typ zu.

Hier ist ein Beispiel, um zu veranschaulichen, was ich meine:

In foo.go:

// foo.go
package foo

func Foo() {...}

In 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
Meiner Meinung nach ist dies die bessere Antwort. Die akzeptierte Antwort ist genauso gültig, erklärt aber nichts anderes als die Theorie für einen solchen Fehler. Die Antwort von @Jonathan Lin erklärt jedoch perfekt diese kryptische Fehlermeldung und wie man sie bekämpft.
fantasitcalbeastly

3

Sie haben möglicherweise importiert,

project/controllers/base

in der

project/controllers/routes

Sie haben bereits zuvor importiert. Das wird nicht unterstützt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.