我正在研究Go项目一个月.好的是Go非常高效.但经过一个月的开发,我已经有了数千行代码和许多代码packages.为了避免导入周期对我来说是一个主要的问题,任何时候我遇到导入周期错误,我不知道第一次问题可能在哪里.
Go编译器也只有非常简单的通知,总是不能很好地快速定位问题,如:main.go:7:3: import cycle not allowed.它只会帮助您了解哪个文件可能导致问题,但不会更深入.由于import关系在代码增长时变得越来越复杂,我迫切希望知道如何在Go中更有效地避免导入周期.任何帮助深表感谢.
我是一个很长时间的python开发人员.我正在尝试Go,将现有的python应用程序转换为Go.它是模块化的,对我来说非常好.
在Go中创建相同的结构后,我似乎陷入了循环导入错误,比我想要的要多得多.从未在python中遇到任何导入问题.我甚至不必使用导入别名.所以我可能有一些循环导入在python中不明显.我实际上发现这很奇怪.
无论如何,我迷路了,试图在Go中解决这些问题.我已经读过接口可以用来避免循环依赖.但我不明白怎么做.我也没有找到任何这方面的例子.有人可以帮我吗?
当前的python应用程序结构如下:
/main.py
/settings/routes.py contains main routes depends on app1/routes.py, app2/routes.py etc
/settings/database.py function like connect() which opens db session
/settings/constants.py general constants
/apps/app1/views.py url handler functions
/apps/app1/models.py app specific database functions depends on settings/database.py
/apps/app1/routes.py app specific routes
/apps/app2/views.py url handler functions
/apps/app2/models.py app specific database functions depends on settings/database.py
/apps/app2/routes.py app specific routes
Run Code Online (Sandbox Code Playgroud)
settings/database.py具有通用功能connect(),可以打开数据库会话.因此,应用程序包调用中的应用程序将database.connect()打开一个数据库会话.
同样的情况是settings/routes.py它具有允许应用程序将其子路由添加到主路由对象的功能.
设置包更多地是关于函数而不是数据/常量.这包含应用程序包中的应用程序使用的代码,否则必须在所有应用程序中复制这些代码.因此,如果我需要更改路由器类,我只需要更改settings/router.py,应用程序将继续工作而不进行任何修改.
我在Golang有一个包含几个模块的项目.由于以下场景,我遇到循环导入问题:
模块游戏包含具有当前游戏状态的结构.另一个模块(Modifier)正在做一些游戏特定的东西和计算,因此修改了游戏状态.因此,Modifier将需要struct Game,但不需要来自Game的任何方法.从Game中调用修饰符,这里我们有循环导入.
游戏启动修改器
修饰符需要Game结构
在我看来,这是一个常见的场景,所以我想知道我应该如何以最好的方式解决它.我的解决方案是创建第三个模块"Structs",它只包含整个应用程序的所有结构.这是一个好的解决方案吗?
我正在开发一个 go 包,它有点复杂,因此我想将源代码组织到多个目录中。
但是,我不希望包的用户不得不使用太长的导入。无论如何,包的内部结构不是他们关心的。
因此,我的包结构看起来是这样的:
subDir1
subSubDir1
subSubDir2
subDir2
subSubDir3
Run Code Online (Sandbox Code Playgroud)
...等等。他们都有自己的导出电话。
我想避免我的用户必须导入
import (
"mypackage/subDir1"
"mypackage/subDir1/subSubDir2"
)
Run Code Online (Sandbox Code Playgroud)
...等等。
我只想,如果他们想使用我的包中的导出函数,他们应该通过简单地导入mypackage.
我尝试package mypackage在所有.go文件中声明。因此,我在不同目录中有源文件,但具有相同的包声明。
在这种情况下,我遇到的问题是我根本无法从同一个包中导入多个目录。它说:
./src1.go:6:15: error: redefinition of ‘mypackage’
"mypackage/mysubdir1"
^
./src1.go:4:10: note: previous definition of ‘mypackage’ was here
"mypackage"
^
./src1.go:5:15: error: redefinition of ‘mypackage’
"mypackage/mysubdir2"
^
./src1.go:4:10: note: previous definition of ‘mypackage’ was here
"mypackage"
^
Run Code Online (Sandbox Code Playgroud)
它以某种方式可能吗?