【发布时间】:2018-01-18 10:31:51
【问题描述】:
我有一个大型 Go 程序,它分布在我的包文件夹根目录中的 50 多个其他 Go 文件中。我知道这被认为很糟糕,所以我决定着手将程序拆分为一些子包以便更好地组织。
不幸的是,在将程序的逻辑部分拆分为子包后,我遇到了可怕的“不允许导入循环”错误。这是因为 Go 编译器拒绝使用循环导入编译任何内容。但是我程序的不同逻辑部分需要相互通信......
我在网上做了一些研究,发现了一些优秀的资源,比如this excellent StackOverflow question,它试图解释如何从高层次上解决这个问题。
我很抱歉,但是这篇文章让我有点过头了,我想知道是否有人可以针对我的特定代码情况给出一个确切的解决方案,并希望以更简单的语言针对完全的 Go 初学者。
简要说明我的代码的组织方式及其作用:
- 它使用 3 种不同的协议(Twitch.tv、Discord 和自定义 WebSocket 服务器)连接到 3 台不同的服务器。
- 制作 3 个子包,每个服务器类型一个,然后在
main.go文件中初始化所有子包似乎很明显。 - 每个子包不仅仅是一个接口;它包含一组全局变量(跟踪连接+其他事物)和一堆函数。 (请注意,如有必要,我可以对其进行重构,使其全部包含在一个巨大的界面中。)
- 95% 的情况下,子包从各自的服务器接收消息并将消息发送回各自的服务器,因此子包大多是分隔的。
- 但是,有时 Twitch.tv 模块需要向 Discord 服务器发送消息,而 Discord 服务器需要向 Twitch.tv 服务器发送消息。所以 Discord 服务器需要能够调用 Twitch.tv 子包内的“Send()”函数,而 Twitch.tv 子包需要能够调用 Discord 子包的“Send()”函数!所以这就是我的循环问题的来源。
【问题讨论】:
-
这有助于/解决您的问题吗? Registering packages in Go without cyclic dependency
标签: go