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
importu package two
(poniżej one.go
)
package one
import (
"go-circular-dependency/two"
)
func AddOne() int {
a := two.Multiplier()
return a + 1
}
Krok 2 - W two.go
imporcie package one
(poniżej two.go
)
package two
import (
"fmt"
"go-circular-dependency/one"
)
func Multiplier() int {
return 2
}
func Total() {
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 tego two.go
powinieneś faktycznie powielić funkcjonalność AddOne()
napisaną w one.go
następujący sposób.
package two
import (
"fmt"
)
func Multiplier() int {
return 2
}
func Total() {
x := Multiplier() + 1
fmt.Println(x)
}
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
.