Есть три структуры: A(package a)
, 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
Может кто-нибудь сказать мне, как решить эту проблему?
Спасибо.