首页 > 解决方案 > 从单独的文件夹加载模型时如何解决“不允许导入周期”

问题描述

我将模块化我的项目,但我有一些问题。

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

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

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

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

标签: gomodulemodelpackage

解决方案


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

在此处输入图像描述

假设我们有两个包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 ausing.以便我可以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


推荐阅读