Golang报“进口周期不允许”错误的2种解决方法

  

  

相信不少金花鼠在写Golang程序都遇到过进口周期不允许问题,本人最近研读go-ethereum源码时,发现定义界面也能解决此问题,还能解决连分包都不能解决的情况,并且比分包更加简单快捷。下面逐个讲解分包和定义接口这两种方法。

  

  

<强>假设有如下使用场景:

  

是应用程序的框架级结构体,在一个包含子模块B和C的指针;
  

  

B为了方便的使用应用的其他子模块(比如C)功能,所以在其结构体包含了一个的指针;
  

  

C要调用一个包中的某个方法;
  

  

  

其程序大致如下:

  

<强>包一代码如下:
  

        包一个      导入(   “fmt”      "github.com/ggq89/mutualdep/b”   "github.com/ggq89/mutualdep/c”   )      输入一个struct {   Pb *反方向   电脑*运费到付   }      func新(ic int) * {   答:=,{   Pc: c.New (ic),   }      一个。Pb=b.New (a)      返回一个   }      v函数Printf (int) {   fmt。Printf (" % v, v)   }      

<强>包b代码如下:
  

        包b      导入(   "github.com/ggq89/mutualdep/a”   )      B型结构{   Pa *一位   }      func新(*一位)* B {   返回,B {   Pa:,   }   }      func (b * b) DisplayC () {   b.Pa.Pc.Show ()   }      

<强>包c代码如下:
  

        包c      进口"github.com/ggq89/mutualdep/a”      C型结构{   Vc int   }      func新(int) * C {   返回,C {   风险投资:我,   }   }      func (c * c)显示(){   a.Printf (c.Vc)   }      

打包依赖包b和包c,同时包b依赖包,包c也依赖包。

  

<强>主要函数代码如下:

        主要包      进口"github.com/ggq89/mutualdep/a”      函数main () {   答:=a.New (3)   a.Pb.DisplayC ()   }      

<强>编译时就会报错如下:

  
  

进口周期不允许
  包主要
  ,,进口github.com/ggq89/mutualdep/a
  ,,进口github.com/ggq89/mutualdep/b
  ,,进口github.com/ggq89/mutualdep/a

     

  

<强>现在的问题是:

  
  

取决于   包b      导入(   "github.com/ggq89/mutualdep/c”   )      B型结构{   爸爸一个   }      {输入接口   GetC() *运费到付   }      func新(一个)* B {   返回,B {   Pa:,   }   }      func (b * b) DisplayC () {   b.Pa.GetC(),告诉()   }      

在打包中补充可能缺少的方法;
  

  

<强>处理后,打包中的代码如下:

        包一个      导入(   “fmt”      "github.com/ggq89/mutualdep/b”   "github.com/ggq89/mutualdep/c”   )      输入一个struct {   Pb *反方向   电脑*运费到付   }      func新(ic int) * {   答:=,{   Pc: c.New (ic),   }      一个。Pb=b.New (a)      返回一个   }      func (*) GetC () * c。C {   返回a.Pc   }      v函数Printf (int) {   fmt。Printf (" % v, v)   }      

  

<强>再次编译,提示如下:

  
  

进口周期不允许
  包主要
  ,,进口github.com/ggq89/mutualdep/a
  ,,进口github.com/ggq89/mutualdep/b
  ,,进口github.com/ggq89/mutualdep/c
  ,,进口github.com/ggq89/mutualdep/a

     

<强>现在是另一个相互依赖问题:

  
  

取决于   包f      进口“fmt”      v函数Printf (int) {   fmt。Printf (" % v, v)   }      

<强>方法移动到包f后,打包的代码如下:

        包一个      导入(   "github.com/ggq89/mutualdep/b”   "github.com/ggq89/mutualdep/c”   )      输入一个struct {   Pb *反方向   电脑*运费到付   }      func新(ic int) * {   答:=,{   Pc: c.New (ic),   }      一个。Pb=b.New (a)      返回一个   }      func (*) GetC () * c。C {   返回a.Pc   }

Golang报“进口周期不允许”错误的2种解决方法