Mam problem z
cykl importu niedozwolony
Pojawia się, gdy próbuję przetestować mój kontroler. Jako wyjście mam
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
Czy ktoś może mi powiedzieć, jak czytać lub rozumieć ten błąd? Gdzie jest zależność?
account
import pakietówbase
pakiet, który importujemux
pakiet, który importujeaccount
pakiet. To cykliczny zestaw zależności importu, co jest niedozwolone. Wygląda na to masz inny cykl, jak również,base
importumux
, których przywózroutes
, który importujebase
.Odpowiedzi:
Oto ilustracja Twojego pierwszego problemu z cyklem importu.
Jak widać na moim złym wykresie ASCII, podczas
project/components/mux
importu tworzysz cykl importuproject/controllers/account
. Ponieważ Go nie obsługuje zależności cyklicznych,import cycle not allowed
błąd pojawia się podczas kompilacji.źródło
watcher
Właśnie to spotkałem. Możesz uzyskiwać dostęp do metody / typu z tego samego pakietu, używając samej nazwy pakietu.
Oto przykład ilustrujący, co mam na myśli:
W foo.go:
// foo.go package foo func Foo() {...}
W 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
źródło
Mogłeś zaimportować,
w środku
Już wcześniej importowałeś. To nie jest obsługiwane.
źródło
Jest to kwestia zależności cyklicznych. Programy Golang muszą być acykliczne. W Golang import cykliczny nie jest dozwolony (czyli jego wykres importu nie może zawierać żadnych pętli)
Powiedzmy, że Twój projekt
go-circular-dependency
ma 2 pakiety „pakiet pierwszy” i „jeden.go” i „pakiet drugi” oraz „dwa.go” Więc struktura projektu jest następująca+--go-circular-dependency +--one +-one.go +--two +-two.go
Ten problem występuje, gdy próbujesz wykonać coś takiego jak śledzenie.
Krok 1 - Podczas
one.go
importupackage two
(poniżejone.go
)package one import ( "go-circular-dependency/two" ) //AddOne is func AddOne() int { a := two.Multiplier() return a + 1 }
Krok 2 - W
two.go
imporciepackage one
(poniżejtwo.go
)package two import ( "fmt" "go-circular-dependency/one" ) //Multiplier is going to be used in package one func Multiplier() int { return 2 } //Total is func Total() { //import AddOne from "package one" x := one.AddOne() fmt.Println(x) }
W kroku 2 zostanie wyświetlony komunikat o błędzie „nie można załadować pakietu: cykl importu niedozwolony” (jest to nazywane błędem „zależności cykliczne ” )
Technicznie rzecz biorąc, jest to zła decyzja projektowa i powinieneś jej unikać tak bardzo, jak to tylko możliwe, ale możesz "przełamać zależności cykliczne przez niejawne interfejsy" (osobiście nie polecam i bardzo odradzam tej praktyki, ponieważ z założenia programy Go muszą być acykliczne )
Staraj się, aby zależność od importu była niewielka. Gdy wykres zależności staje się głębszy (tj. Pakiet x importuje y, y importuje z, z importuje x), wówczas bardziej prawdopodobne stają się zależności cykliczne.
Czasami powtórzenie kodu nie jest złym pomysłem, co jest przeciwieństwem DRY (nie powtarzaj się)
Dlatego w kroku 2, który jest w
two.go
środku, nie powinieneś importować pierwszego pakietu. Zamiast tegotwo.go
powinieneś faktycznie powielić funkcjonalnośćAddOne()
napisaną wone.go
następujący sposób.package two import ( "fmt" ) //Multiplier is going to be used in package one func Multiplier() int { return 2 } //Total is func Total() { // x := one.AddOne() x := Multiplier() + 1 fmt.Println(x) }
źródło