相信不少金花鼠在写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种解决方法