为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕无忌1623718 2021-06-04 18:10:29
我在 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 工具的更多信息。


查看完整回答
反对 回复 2021-06-07
?
FFIVE

TA贡献1797条经验 获得超6个赞

为了补充 jnml 的答案(有助于“调试”循环引用问题),您可以使用依赖倒置来打破这些循环,并结合依赖注入。对于应用程序,我总是尝试遵循Clean Architecture的指导方针——参见这里的 Go 特定示例——我发现 Go 的接口的“非声明性实现”(也就是说,你不必明确地说type MyStruct struct implements IfceSomething) 使这变得非常简单。

所以,如果你有包A -> B -> C -> A,你InterfaceA在包 C 中创建(一些相关的名称,显然,比包相关的行为更相关:) 并使它依赖于这个接口而不是包 A,并且你确保包 A“实现"这个界面。

然后你只需要在某个时候提供 A 到 C 的具体实现(这里有很多可能性,我通常在知道所有依赖关系的主包中做这个“粘合”代码)。


查看完整回答
反对 回复 2021-06-07
  • 3 回答
  • 0 关注
  • 289 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信