我有问题
不允许进口周期
看来,当我试图测试我的控制器时.作为输出我有
can't load package: import cycle not allowed
package project/controllers/account
imports project/controllers/base
imports project/components/mux
imports project/controllers/account
import cycle not allowed
package project/controllers/account
imports project/controllers/base
imports project/components/mux
imports project/controllers/account
import cycle not allowed
package project/controllers/account
imports project/controllers/base
imports project/components/mux
imports project/controllers/routes
imports project/controllers/base
Run Code Online (Sandbox Code Playgroud)
有人能告诉我,如何阅读或理解这个错误?依赖在哪里错了?
jma*_*ney 137
以下是您的第一个导入周期问题的说明.
project/controllers/account
^ \
/ \
/ \
/ \/
project/components/mux <--- project/controllers/base
Run Code Online (Sandbox Code Playgroud)
你可以用我的坏ASCII图表看是要创建一个导入周期时project/components/mux
进口project/controllers/account
.由于Go不支持循环依赖,因此import cycle not allowed
在编译期间会出现错误.
Jon*_*Lin 73
我刚遇到这个.您可能正在使用包名本身从同一包中访问方法/类型.
这是一个例子来说明我的意思:
在foo.go中:
// foo.go
package foo
func Foo() {...}
Run Code Online (Sandbox Code Playgroud)
在foo_test.go中:
// foo_test.go
package foo
// try to access Foo()
foo.Foo() // WRONG <== This was the issue. You are already in package foo, there is no need to use foo.Foo() to access Foo()
Foo() // CORRECT
Run Code Online (Sandbox Code Playgroud)
小智 6
这是一个循环依赖问题。Golang 程序必须是非循环的。在 Golang 中不允许循环导入(即其导入图不得包含任何循环)
假设你的项目go-circular-dependency
有 2 个包“包一”&它有“one.go”&“包二”&它有“two.go”所以你的项目结构如下
+--go-circular-dependency
+--one
+-one.go
+--two
+-two.go
Run Code Online (Sandbox Code Playgroud)
当您尝试执行以下操作时会出现此问题。
第 1 步- 在one.go
您导入package two
(以下是one.go
)
package one
import (
"go-circular-dependency/two"
)
//AddOne is
func AddOne() int {
a := two.Multiplier()
return a + 1
}
Run Code Online (Sandbox Code Playgroud)
第 2 步- 在two.go
您导入package one
(以下是two.go
)
package two
import (
"fmt"
"go-circular-dependency/one"
)
//Multiplier is going to be used in package one
func Multiplier() int {
return 2
}
//Total is
func Total() {
//import AddOne from "package one"
x := one.AddOne()
fmt.Println(x)
}
Run Code Online (Sandbox Code Playgroud)
在步骤 2 中,您将收到错误“无法加载包:不允许导入循环”(这称为“循环依赖”错误)
从技术上讲,这是一个糟糕的设计决策,您应该尽可能避免这种情况,但是您可以“通过隐式接口打破循环依赖”(我个人不推荐,并强烈反对这种做法,因为按照设计 Go 程序必须是非循环的)
尽量保持你的导入依赖浅。当依赖关系图变得更深(即包 x 导入 y,y 导入 z,z 导入 x)时,循环依赖变得更有可能。
有时代码重复也不错,这与 DRY 正好相反(不要重复自己)
因此,在第 2 步中,two.go
您不应导入包 1。相反,two.go
您应该实际复制AddOne()
写入的功能,one.go
如下所示。
package two
import (
"fmt"
)
//Multiplier is going to be used in package one
func Multiplier() int {
return 2
}
//Total is
func Total() {
// x := one.AddOne()
x := Multiplier() + 1
fmt.Println(x)
}
Run Code Online (Sandbox Code Playgroud)
您可能已经进口了,
project/controllers/base
Run Code Online (Sandbox Code Playgroud)
在 - 的里面
project/controllers/routes
Run Code Online (Sandbox Code Playgroud)
您之前已经导入过。这是不支持的。