【问题标题】:How to resolve `import cycle not allowed` while loading model from separate folder从单独的文件夹加载模型时如何解决“不允许导入周期”
【发布时间】:2023-03-13 02:50:01
【问题描述】:

我打算将我的项目模块化,但我遇到了一些问题。

一般情况下,我会将所有模型文件放到同一个包模型中(同一个文件夹,大约30个文件),但现在我想把它们放到单独的文件夹中以便于管理它们(每个模块都会有自己的模型文件夹)。

但是,如果我尝试将模型放在此图像中的单独文件夹中,我会收到“导入周期错误”,因为它们不是同一个包(两个表将用于相互查找,这就是发生错误的地方)。

https://i.imgur.com/3wqJ4BK.png

那么有没有办法将模型放在单独的文件夹中,或者有更好的方法来管理模型?

【问题讨论】:

  • 我知道为什么会出现这个错误,我想知道有什么方法可以在单独的文件夹中管理模型(每个模块文件夹都会有模型文件夹,其中包含许多模型文件)

标签: go module model package


【解决方案1】:

我不确定这是否是一个好策略。但是如果我遇到你的情况,我会尝试通过以下方法解决它。

假设我们有两个包package apackage 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,这样我就可以在本地使用a 的对象并导入package b 来调用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

【讨论】:

    猜你喜欢
    • 2018-10-12
    • 1970-01-01
    • 2022-07-09
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多