前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang代码循环依赖问题

Golang代码循环依赖问题

作者头像
王小明_HIT
发布2021-12-02 13:15:36
1.1K0
发布2021-12-02 13:15:36
举报
文章被收录于专栏:程序员奇点程序员奇点

什么是循环依赖

其实就 package A 引入了 package B ,然后 package B 又引入了 package A ,因此形成了循环依赖。

现象如下:

测试代码
代码语言:javascript
复制
package A

import (
 "strings"

 B “/GoProject/main/gobase/cycle/b"
)

func Foo(a string) (string) {
 return B.Add(a)
}

func Minus(a string) (string) {
 return strings.Trim(a, "\t")
}
代码语言:javascript
复制
package B

import A "GoProject/main/gobase/cycle/a"

func Goo(a string) (string) {
 return A.Minus(a)
}

func Add(a string) (string) {
 return a + "----"
}

运行测试代码:

代码语言:javascript
复制
package cycle
import (
 "testing"

 A "GoProject/main/gobase/cycle/a"
)

func TestCycle(t *testing.T) {
 A.Foo("good")
}

运行结果:

代码语言:javascript
复制
packageGoProject/main/gobase/cycle (test)
 imports /GoProject/main/gobase/cycle/a
 importsGoProject/main/gobase/cycle/b
 imports GoProject/main/gobase/cycle/a: import cycle not allowed
FAIL

外观模式实现

我们之前的java设计模式中介绍到了外观模式,发现这在很有用 我首先将包A,B中的方法抽象成接口,将方法先隔离出来

代码语言:javascript
复制
package service

type A interface {
 Minus(s string) (string)
}

type B interface {
 Add(s string) (string)
}

然后我A,B实现接口。为了容易处理,定义两个结构体进行处理。

代码语言:javascript
复制
package A

import (
 "strings"
 "github.com/hundred666/GoTest/service"
)

type AImpl struct {
 b service.B
}

func (a *AImpl) Foo(s string) (string) {
 return a.b.Add(s)
}

func (a *AImpl) Minus(s string) (string) {
 return strings.Trim(s, "\t")
}

B的设计如下:

代码语言:javascript
复制
package B

import "github.com/hundred666/GoTest/service"

type BImpl struct {
 a service.A
}

func (b *BImpl) Goo(a string) (string) {
 return b.a.Minus(a)
}

func (b *BImpl) Add(a string) (string) {
 return a + "----"
}

实现了方法,得能够将实例化的变量分别放入A,B结构体中,因此A需要实现以下方法

代码语言:javascript
复制
func NewA() *AImpl {
 return new(AImpl)
}
func (a *AImpl) SetB(b service.B) {
 a.b = b
}

B需要实现以下方法

代码语言:javascript
复制
func NewB() *BImpl {
 return new(BImpl)
}

func (b *BImpl) SetA(a service.A) {
 b.a = a
}

需要调用的时候就可以去调用了

代码语言:javascript
复制
package main

import (
 "github.com/hundred666/GoTest/B"
 "github.com/hundred666/GoTest/A"
 "fmt"
)

func main() {
 b := B.NewB()
 a := A.NewA()
 a.SetB(b)
 r := a.Foo("aa")
 fmt.Println(r)
}

参考资料

  • https://zhuanlan.zhihu.com/p/326112287
  • https://segmentfault.com/a/1190000038897207
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员奇点 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是循环依赖
    • 测试代码
      • 外观模式实现
        • 参考资料
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档