一聚教程网:一个值得你收藏的教程网站

热门教程

golang不允许循环import问题("import cycle not allowed")

时间:2022-06-25 04:43:17 编辑:袖梨 来源:一聚教程网

golang不允许循环import package,如果检测到import cycle,会在编译时报错,通常import cycle是因为设计错误或包的规划问题。
以下面的例子为例,package a依赖package b,同事package b依赖package a
package a
 
import (
  "fmt"
 
  "github.com/mantishK/dep/b"
)
 
type A struct {
}
 
func (a A) PrintA() {
  fmt.Println(a)
}
 
func NewA() *A {
  a := new(A)
  return a
}
 
func RequireB() {
  o := b.NewB()
  o.PrintB()
}

package b:

package b
 
import (
  "fmt"
 
  "github.com/mantishK/dep/a"
)
 
type B struct {
}
 
func (b B) PrintB() {
  fmt.Println(b)
}
 
func NewB() *B {
  b := new(B)
  return b
}
 
func RequireA() {
  o := a.NewA()
  o.PrintA()
}

就会在编译时报错:
import cycle not allowed
package github.com/mantishK/dep/a
  imports github.com/mantishK/dep/b
  imports github.com/mantishK/dep/a

现在的问题就是:
A depends on B
B depends on A

那么如何避免?
引入package i, 引入interface
package i
 
type Aprinter interface {
  PrintA()
}

让package b import package i
package b
 
import (
  "fmt"
 
  "github.com/mantishK/dep/i"
)
 
 
func RequireA(o i.Aprinter) {
  o.PrintA()
}

引入package c
package c
 
import (
  "github.com/mantishK/dep/a"
  "github.com/mantishK/dep/b"
)
 
func PrintC() {
  o := a.NewA()
  b.RequireA(o)
}

现在依赖关系如下:
A depends on B
B depends on I
C depends on A and B

热门栏目