2013-04-23 2 views
34

저는 한 달 동안 Go 프로젝트를 진행하고 있습니다. 좋은 점은 Go가 실제로 매우 효율적이라는 것입니다. 하지만 한 달 동안 개발 한 후에는 이미 수천 줄의 코드와 많은 코드가있었습니다. packages. 가져 오기주기를 피하려면 수입 사이클 오류가 발생할 때마다 문제가 처음 발생할 수 있다는 것을 모른다고 나에게 큰 문제가됩니다.Go에서 가져 오기주기를 피하는 방법에 대한 좋은 조언이 있으십니까?

Go 컴파일러는 또한 main.go:7:3: import cycle not allowed과 같이 신속하게 문제를 찾을 수 없을 정도로 매우 간단한 통지 만 있습니다. 어떤 파일이 문제를 일으킬 수 있지만 더 깊이는 알 수는 없습니다. 코드가 커지면서 import 관계가 점점 복잡해지기 때문에 Go에서보다 효율적으로 가져 오기주기를 피하는 방법을 알고 싶어합니다. 어떤 도움이라도 대단히 감사합니다. <import-path>이 비어있는 경우 또는 현재 디렉토리에 -

답변

54
go list -f '{{join .Deps "\n"}}' <import-path> 

<import-path>에서 패키지에 대한 수입 의존성을 보여줍니다. 또한

go list -f '{{join .DepsErrors "\n"}}' <import-path> 

희망 귀하의 경우 몇 가지 유용한 정보를 보여줍니다. 이동 목록 도구에 대한 추가 정보는

go help list 

의 출력을 참조하십시오.

+11

+1에 도달하면 10K가됩니다! – peterSO

+2

@peterSO : 고맙습니다 ;-) – zzzz

+2

확실히 알아두면 좋겠지 만 실제로 이동 목록에 대해서도 몰랐습니다. – mna

36

순환 참조 문제를 디버그하는 데 도움이되는 jnml의 대답을 보완하기 위해 dependency inversion을 사용하여 종속성 주입과 함께 이러한주기를 중단 할 수 있습니다. 응용 프로그램의 경우 항상 Clean Architecture의 지침을 따르려고합니다. Go 관련 예제는 here을 참조하십시오. Go의 "선언적 구현"인터페이스를 찾을 수 있습니다. 즉, 명시 적으로 type MyStruct struct implements IfceSomething)이 매우 간단합니다. 당신이 패키지 A -> B -> C -> A이있는 경우

그래서, 당신은 분명히 InterfaceA (일부 관련 이름을 생성, 더 행동과 관련된보다 패키지 관련 패키지 C에서 :) 그리고이 인터페이스 대신 패키지 A를 따라하게하고 패키지 A가이 인터페이스를 "구현"하는지 확인하십시오.

그런 다음 몇 가지 점에서 A부터 C까지의 구체적인 구현을 제공하면됩니다 (여기에서는 여러 가지 가능성이 있습니다. 일반적으로 모든 종속성을 알고있는 주 패키지에서이 "접착제"코드를 사용합니다).