【golang教程】golang不允许循环import问题("import cycle not allowed")

更新时间:2020-04-01    来源:设计基础    手机版     字体:

【www.bbyears.com--设计基础】

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

本文来源:http://www.bbyears.com/wangyezhizuo/91248.html

热门标签

更多>>

本类排行