登录
首页 >  Golang >  Go问答

如何解决接口导入周期不允许的问题?

来源:stackoverflow

时间:2024-03-11 22:03:28 222浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《如何解决接口导入周期不允许的问题?》,涉及到,有需要的可以收藏一下

问题内容

共有三个结构:a(包a)b(包b)c(包c)

b 想要使用 c 的功能,并且 c 想要使用 b 的功能。 a 同时具有 bc 实例,因此 b 可以通过 a 访问 c 的功能,反之亦然。

我使用了在另一个 package i 中声明的接口 ageter ,其函数声明为 geta() *a.a 现在我在 bc 中使用此接口 ageter,通过它我分别获取 a 的实例并访问 cb 的功能。

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()
}

我应该能够在 c 中使用 b 的功能,反之亦然。

在构建代码时,我收到 import cycle not allowed 错误。 兹克布克兹克布 不允许导入周期 包主 导入基础知识/importcycleissue/issuefix/a 导入基础知识/importcycleissue/issuefix/b 导入基础知识/importcycleissue/issuefix/i 导入基础知识/importcycleissue/issuefix/a 弯弯弯弯 谁能告诉我如何解决这个问题?

谢谢。


解决方案


你已经快到了,但我认为你可能误解了应该如何使用接口来修复循环依赖。您已经定义了直接引用具体类型的接口,因此依赖循环仍然存在。让 i 依赖于 a 并不能解决问题,它只是扩展了循环依赖。

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

您需要使用新包 i 来定义接口。这些接口应该相互引用 - 引用 a、b 或 c。b 和 c 应该引用 i 中的接口类型- 没有对 a、b 或 c 的引用。因此,我必须为所有 3 个包中的必要类型定义接口。例如:

package i

import (
)

type A interface {
    GetB() B
    GetC() C
}

type B interface {
    UseC()
}

type C interface {
    UseB()
}

---------------------------------------------------
package a

import (
    "fmt"

    "basics/importCycleIssue/issueFix/b"
    "basics/importCycleIssue/issueFix/c"
    "basics/importCycleIssue/issueFix/i"
)

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

func NewA() *A {
    a := &A{}
    a.B = b.NewB(a)
    a.C = c.NewC(a)
    return a
}

// These methods implement i.A and return the i.B and i.C interface types
func (a A) GetB() i.B {
    return a.B
}

func (a A) GetC() i.C {
    return a.C
}

---------------------------------------------------
package b

import (
    "fmt"

    "basics/importCycleIssue/issueFix/i"
)

type B struct {
    a i.A
}

func NewB(a i.A) *B {
    b := &B{a: a}
    return b
}

func (b *B) UseC() {
    fmt.Println("need to use C:",b.a.GetC())
}

----------------------------------------------------
package c

import (
    "fmt"

    "basics/importCycleIssue/issueFix/i"
)

type C struct {
    a i.A
}

func NewC(a i.A) *C {
    c := &C{a: a}
    return c
}

func (c *C) UseB() {
    fmt.Println("need to use B:",c.a.GetB())
}

终于介绍完啦!小伙伴们,这篇关于《如何解决接口导入周期不允许的问题?》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>