猿问

关于如何避免 Go 中的导入循环有什么好的建议吗?

我在 Go 项目上工作了一个月。好消息是 Go 真的非常高效。但是经过一个月的开发,我已经有了数千行代码和许多packages. 避免导入周期对我来说是一个主要问题,每当我遇到导入周期错误时,我第一次都不知道问题出在哪里。

转到编译器也只有很简单的通知,总是不够好,快速定位问题,如:main.go:7:3: import cycle not allowed。它只会帮助您了解哪个文件可能导致问题,但不会更深入。由于import随着代码的增长关系变得越来越复杂,我很想知道如何在 Go 中更有效地避免导入循环。任何帮助深表感谢。


慕无忌1623718
浏览 290回答 3
3回答

海绵宝宝撒

go&nbsp;list&nbsp;-f&nbsp;'{{join&nbsp;.Deps&nbsp;"\n"}}'&nbsp;<import-path><import-path>如果<import-path>保留为空,将在- 或当前目录中显示包的导入依赖项。或者go&nbsp;list&nbsp;-f&nbsp;'{{join&nbsp;.DepsErrors&nbsp;"\n"}}'&nbsp;<import-path>希望在您的案例中显示一些有用的信息。另见输出go&nbsp;help&nbsp;list有关 go list 工具的更多信息。

FFIVE

为了补充 jnml 的答案(有助于“调试”循环引用问题),您可以使用依赖倒置来打破这些循环,并结合依赖注入。对于应用程序,我总是尝试遵循Clean Architecture的指导方针——参见这里的 Go 特定示例——我发现 Go 的接口的“非声明性实现”(也就是说,你不必明确地说type MyStruct struct implements IfceSomething) 使这变得非常简单。所以,如果你有包A -> B -> C -> A,你InterfaceA在包 C 中创建(一些相关的名称,显然,比包相关的行为更相关:) 并使它依赖于这个接口而不是包 A,并且你确保包 A“实现"这个界面。然后你只需要在某个时候提供 A 到 C 的具体实现(这里有很多可能性,我通常在知道所有依赖关系的主包中做这个“粘合”代码)。
随时随地看视频慕课网APP

相关分类

Go
我要回答