가져 오기주기가 허용되지 않습니다


135

나는 문제가있다

가져 오기주기가 허용되지 않습니다

컨트롤러를 테스트하려고 할 때 나타납니다. 출력으로

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

누군가이 오류를 읽거나 이해하는 방법을 말해 줄 수 있습니까? 의존성은 어디에 있습니까?


13
account패키지 가져옵니다 base수입 패키지, mux수입 패키지, account패키지. 이는 주기적으로 가져 오기 종속성 세트이며 허용되지 않습니다. baseimports mux, imports routes, imports 라는 또 다른 주기가있는 것처럼 보입니다 base.
Amit Kumar Gupta

답변:


170

다음은 첫 번째 가져 오기주기 문제를 보여줍니다.

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

잘못된 ASCII 차트에서 볼 수 있듯이 가져올 때 project/components/mux가져 오기주기를 생성하고 있다는 것 project/controllers/account입니다. Go는 순환 종속성을 지원하지 않으므로 import cycle not allowed컴파일 시간 동안 오류가 발생합니다.


10
너무 나빠서 컴파일에만 나타납니다. 내가 한 일을 할 수 없다는 것을보기 위해 홀 프로젝트를 재구성하는 데 많은 시간을 낭비했습니다 ... dafug ...
C4d

35
이것이 내가 Go를 싫어하는 이유 중 하나입니다. 그리고 그것은 십여 가지 이유 중 하나 일뿐입니다.
tom10271 8

13
원형 뎁스를 허용하면 뎁 중 하나가 변경 될 때마다 전체 딥 서클이 다시 컴파일되어야하므로 컴파일 시간이 크게 증가합니다. 순환 깊이가 있으면 프로그램에 대해 추론하기가 어렵고 복잡해지기 때문에 인지력이 높습니다.
jmaloney

어떤 linter를 사용하고 있습니까? 코드 대 린트를 보지 못합니다
Gopherine

다음을 통해 앱을 실행하는 동안이 오류를 볼 수 있습니다.watcher
R Sun

98

방금이 문제가 발생했습니다. 패키지 이름 자체를 사용하여 동일한 패키지 내에서 메소드 / 유형에 액세스 할 수 있습니다.

다음은 내가 의미하는 바를 설명하는 예입니다.

foo.go에서 :

// foo.go
package foo

func Foo() {...}

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
제 생각에는 이것이 더 나은 대답입니다. 받아 들여진 대답은 똑같이 유효하지만 그러한 실패에 대한 이론 이외의 것은 설명하지 않습니다. 그러나 @Jonathan Lin의 답변은이 암호 오류 메시지와이를 해결하는 방법을 완벽하게 설명합니다.
fantasitcalbeastly

3

수입했을 수도 있습니다.

project/controllers/base

내부

project/controllers/routes

이전에 이미 가져 왔습니다. 지원되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.