有三种结构:B(package b)
,C(package c)
,B
。
C
要使用C
的功能,而B
要使用A
的功能。
B
同时具有C
和B
实例,因此C
可以通过A
访问Ageter
的功能,反之亦然。
我使用了在另一个package i
中声明的接口GetA() *a.A
,该接口的函数声明为Ageter
现在,我在B
和C
中使用此接口A
,通过它我分别获得C
的实例和访问B
和package 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
);
谁能告诉我如何解决此问题?
谢谢。
答案 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
}