详解golang避免循环导入问题(“进口周期不允许”)

  

  

golang不允许循环导入包,如果检测到进口周期,会在编译时报错,通常进口周期是因为设计错误或包的规划问题。
  

  

以下面的例子为例,包一个依赖包b,同事包b依赖包一个
  

        包一个      导入(   “fmt”      "github.com/mantishK/dep/b”   )      输入一个struct {   }      func(一)不要(){   fmt.Println (a)   }      func NewA () * {   答:=new ()   返回一个   }      func RequireB () {   o:=b.NewB ()   o.PrintB ()   }      

方案b:         包b      导入(   “fmt”      "github.com/mantishK/dep/a”   )      B型结构{   }      func (b b) PrintB () {   fmt.Println (b)   }      func新手()* B {   b:=new (b)   返回b   }      func RequireA () {   o:=a.NewA ()   o.PrintA ()   }      

就会在编译时报错:
  

  
  

进口周期不允许
  包github.com/mantishK/dep/a
  ,进口github.com/mantishK/dep/b
  ,进口github.com/mantishK/dep/a

     

现在的问题就是:
  

  
  

取决于   包我      {Aprinter接口类型   不要把()   }      

让包b导入包我
  

        包b      导入(   “fmt”      "github.com/mantishK/dep/i”   )         func RequireA (o i.Aprinter) {   o.PrintA ()   }      

引入包c
  

        包c      导入(   "github.com/mantishK/dep/a”   "github.com/mantishK/dep/b”   )      func PrintC () {   o:=a.NewA ()   b.RequireA (o)   }      

现在依赖关系如下:
  

  
  

取决于B
  取决于我
  A和B C取决于

     

  

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
  

详解golang避免循环导入问题(“进口周期不允许”)