我在 Go 项目上工作了一个月。好消息是 Go 真的非常高效。但是经过一个月的开发,我已经有了数千行代码和许多packages. 避免导入周期对我来说是一个主要问题,每当我遇到导入周期错误时,我第一次都不知道问题出在哪里。转到编译器也只有很简单的通知,总是不够好,快速定位问题,如:main.go:7:3: import cycle not allowed。它只会帮助您了解哪个文件可能导致问题,但不会更深入。由于import随着代码的增长关系变得越来越复杂,我很想知道如何在 Go 中更有效地避免导入循环。任何帮助深表感谢。
3 回答
海绵宝宝撒
TA贡献1809条经验 获得超8个赞
go list -f '{{join .Deps "\n"}}' <import-path>
<import-path>
如果<import-path>
保留为空,将在- 或当前目录中显示包的导入依赖项。或者
go list -f '{{join .DepsErrors "\n"}}' <import-path>
希望在您的案例中显示一些有用的信息。另见输出
go help list
有关 go list 工具的更多信息。
FFIVE
TA贡献1797条经验 获得超6个赞
为了补充 jnml 的答案(有助于“调试”循环引用问题),您可以使用依赖倒置来打破这些循环,并结合依赖注入。对于应用程序,我总是尝试遵循Clean Architecture的指导方针——参见这里的 Go 特定示例——我发现 Go 的接口的“非声明性实现”(也就是说,你不必明确地说type MyStruct struct implements IfceSomething
) 使这变得非常简单。
所以,如果你有包A -> B -> C -> A
,你InterfaceA
在包 C 中创建(一些相关的名称,显然,比包相关的行为更相关:) 并使它依赖于这个接口而不是包 A,并且你确保包 A“实现"这个界面。
然后你只需要在某个时候提供 A 到 C 的具体实现(这里有很多可能性,我通常在知道所有依赖关系的主包中做这个“粘合”代码)。
- 3 回答
- 0 关注
- 289 浏览
添加回答
举报
0/150
提交
取消