Ciclo di importazione non consentito


135

Ho un problema con

ciclo di importazione non consentito

Sembra, quando sto provando a testare il mio controller. Come uscita ho

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

Qualcuno può dirmi come leggere o comprendere questo errore? Dov'è la dipendenza sbagliata?


13
Il accountpacchetto importa il basepacchetto, che importa il muxpacchetto, che importa il accountpacchetto. Questo è un insieme ciclico di dipendenze di importazione, che non è consentito. Sembra che tu abbia anche un altro ciclo, baseimportazioni mux, quali importazioni routes, quali importazioni base.
Amit Kumar Gupta,

Risposte:


170

Ecco un'illustrazione del tuo primo problema del ciclo di importazione.

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

Come puoi vedere con il mio cattivo grafico ASCII è che stai creando un ciclo di project/components/muximportazione durante le importazioni project/controllers/account. Poiché Go non supporta dipendenze circolari, viene visualizzato l' import cycle not allowederrore durante il tempo di compilazione.


10
Peccato che questo si manifesta solo durante la compilazione. Ho perso molto tempo per ristrutturare il mio progetto di buca solo per vedere che non mi è permesso fare quello che ho fatto ... Dafug ...
C4d

35
Questo è uno dei motivi per cui non mi piace andare. Ed è solo una delle decine di ragioni.
tom10271,

13
Consentire i Deps circolari aumenterebbe significativamente i tempi di compilazione poiché l'intera cerchia dei Deps dovrebbe essere ricompilata ogni volta che uno dei Deps viene cambiato. Avere profondi circolari è anche un carico cognitivo pesante poiché rende più difficile ragionare sul tuo programma e tende alla complessità.
jmaloney,

quale linter stai usando non vedo alcun accenno sul codice vs
Gopherine

Riesco a vedere questo errore durante l'esecuzione dell'appwatcher
R Dom

98

L'ho appena incontrato. È possibile accedere a un metodo / tipo dallo stesso pacchetto utilizzando il nome del pacchetto stesso.

Ecco un esempio per illustrare cosa intendo:

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
Secondo me questa è la risposta migliore. La risposta accettata è altrettanto valida, ma non spiega altro che la teoria per un tale fallimento. La risposta di @Jonathan Lin, tuttavia, spiega perfettamente questo messaggio di errore criptico e come combatterlo.
fantasitcalbeastly

3

Potresti aver importato,

project/controllers/base

dentro il

project/controllers/routes

Hai già importato prima. Questo non è supportato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.