我正在使用界面,如何解决导入周期不允许的问题?

时间:2019-01-10 13:52:11

标签: go interface

有三种结构:B(package b)C(package c)B

C要使用C的功能,而B要使用A的功能。 B同时具有CB实例,因此C可以通过A访问Ageter的功能,反之亦然。

我使用了在另一个package i中声明的接口GetA() *a.A,该接口的函数声明为Ageter 现在,我在BC中使用此接口A,通过它我分别获得C的实例和访问Bpackage a import ( "fmt" "basics/importCycleIssue/issueFix/b" "basics/importCycleIssue/issueFix/c" ) type A struct { B *b.B C *c.C } var a = NewA() func NewA() *A { a := &A{} a.B = b.NewB(a) a.C = c.NewC(a) return a } func GetA() *A{ return a } --------------------------------------------------- package b import ( "fmt" "basics/importCycleIssue/issueFix/i" ) type B struct { o i.Ageter } func NewB(o i.Ageter) *B { b := &B{o: o} return b } func (b *B) UseC() { fmt.Println("need to use C:",b.o.GetA().C) } ---------------------------------------------------- package c import ( "fmt" "basics/importCycleIssue/issueFix/i" ) type C struct { o i.Ageter } func NewC(o i.Ageter) *C { c := &C{o: o} return c } func (c *C) UseB() { fmt.Println("need to use B:",c.o.GetA().B) } ---------------------------------------------------- package i import ( "basics/importCycleIssue/issueFix/a" ) type Aprinter interface { PrintA() } type Ageter interface { GetA() *a.A } --------------------------------------------------- package main import ( "basics/importCycleIssue/issueFix/a" ) func main() { o := a.NewA() o.B.UseC() o.C.UseB() } 的功能

B

我应该能够在C中使用import cycle not allowed的功能,反之亦然。

在构建代码时,我遇到 import cycle not allowed package main imports basics/importCycleIssue/issueFix/a imports basics/importCycleIssue/issueFix/b imports basics/importCycleIssue/issueFix/i imports basics/importCycleIssue/issueFix/a 错误。 delete from table1 where [s/n] IN ( select [s/n] FROM Table1 group by [s/n] having count(Distinct status ) > 1 ); 谁能告诉我如何解决此问题?

谢谢。

2 个答案:

答案 0 :(得分:2)

您快到了,但是我认为您可能会误解了应该如何使用接口来修复循环依赖性。您已经定义了直接引用具体类型的接口,因此依赖周期仍然存在。使$(window).on('load', function() { $("#content").load("content/index_content.php"); $(document).on('click', 'a', function(e) { if($('a[href^="http://"]')) return; else{ e.preventDefault(); $("#nav div").removeClass("active"); $(this).children("div").addClass("active"); $('#content').load($(this).attr('href')); return false; } )}; )}; 依赖于i并不能解决问题,而只是扩展了循环依赖性。

让我们回到您的核心问题:

  

B想要使用C的功能,而C想要使用B的功能。A具有B和C实例,因此B可以通过A来访问C的功能,反之亦然。

您需要使用新的软件包a定义接口,仅 。这些接口应该互相引用-对A,B或C的引用。B和C应该引用i中的接口类型。 - no 引用A,B或C。因此,我必须在所有3个程序包中为必需的类型定义接口。例如:

i

答案 1 :(得分:0)

执行不允许导入周期。如果检测到任何导入周期,则会引发编译时错误。通常,导入周期被认为是错误的设计。

有多种解决方法,例如,您可以使用同一包在3个不同的文件中描述这3种类型:

package types

type A struct {
    B *b.B
    C *c.C
}

type B struct {
    o i.Ageter
}

type C struct {
    o i.Ageter
}