go - 从单独的文件夹加载模型时如何解决“不允许导入周期”
问题描述
我将模块化我的项目,但我有一些问题。
通常,我会将所有模型文件放在同一个包模型中(同一个文件夹,大约 30 个文件),但现在我想将它们放在单独的文件夹中以便于管理它们(每个模块都会有自己的模型文件夹)。
但是,如果我尝试将模型放在此图像中的单独文件夹中,我将收到“导入周期错误”,因为它们不是同一个包(两个表将用于相互查找,这就是发生错误的地方)。
https://i.imgur.com/3wqJ4BK.png
那么有没有办法将模型放在单独的文件夹中,或者有更好的方法来管理模型?
解决方案
我不确定这是否是一个好策略。但是,如果我处于您的情况,我会尝试通过以下方法解决它。
假设我们有两个包package a
和package b
.
package a
import ".../code/module2"
var StrA="Hi! I'm A and I'm calling B: "
func FuncA() string {
return "Inside A"
}
func AtoB() {
fmt.Println(StrA+b.FuncB())
}
package b
import ".../code/module1"
var StrB="Hi! I'm B and I'm calling A: "
func FuncB() string {
return "Inside B"
}
func BtoA() {
fmt.Println(StrB+a.FuncA())
}
你不能使用函数AtoB()
或者BtoA()
因为它会循环。一种可能的方法是通过在每个模块中创建子目录来解决它。移动那些导致循环的代码部分。像这里AtoB()
和BtoA()
。
内部extraA.go
:
package extended
import (
"fmt"
. ".../code/module1"
b ".../code/module2"
)
func AtoB() {
fmt.Println(StrA+b.FuncB())
}
我导入package a
using.
以便我可以a
在本地使用 's 对象并导入package b
到 call FuncB()
。我也将 移动BtoA()
到 里面的另一个子目录module2
。
现在我可以使用这两个功能而无需进行任何循环。
package main
import (
extraA ".../code/module1/extended"
extraB ".../code/module2/extended"
)
func main() {
extraA.AtoB()
extraB.BtoA()
}
输出:
Hi! I'm A and I'm calling B: Inside B
Hi! I'm B and I'm calling A: Inside A
推荐阅读
- asp.net-core - ASP.NET CORE 2.0 分布式会话管理与 AWS DynamoDB
- c# - 在不带括号的 DataGridView 中显示负值
- cmake - CPack 子项目和公共标头
- mysql - 使用 mysql 连接查询选择数据
- react-native - 实施来自 salesforce Marketing Cloud 的推送通知以响应本机移动应用程序
- angular - 了解 Angular 导入语句
- java - Spring MVC + StreamingResponseBody - 异常导致HTTP OK
- php - PHP:preg_match_all() - 如何使用正则表达式正确查找所有出现的 OR 分隔子字符串?
- xml - XPath 中的变量?
- php - 如何去除表头间隙