Golang代码循环依赖问题

简介: Golang代码循环依赖问题

什么是循环依赖


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

现象如下:

image.png

测试代码


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")
}
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 + "----"
}


运行测试代码:


package cycle
import (
 "testing"
 A "GoProject/main/gobase/cycle/a"
)
func TestCycle(t *testing.T) {
 A.Foo("good")
}


运行结果:


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中的方法抽象成接口,将方法先隔离出来


package service
type A interface {
 Minus(s string) (string)
}
type B interface {
 Add(s string) (string)
}


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


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的设计如下:


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需要实现以下方法


func NewA() *AImpl {
 return new(AImpl)
}
func (a *AImpl) SetB(b service.B) {
 a.b = b
}


B需要实现以下方法


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


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


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)
 }
相关文章
|
9月前
|
Go
golang中for循环的遍历特点、数据类型和string转换
golang中for循环的遍历特点、数据类型和string转换
|
9月前
|
JavaScript 前端开发 Go
正确使用 Golang 循环创建新切片的方式
正确使用 Golang 循环创建新切片的方式
|
Linux Go vr&ar
Golang cgo:如何在Go代码中调用C语言代码?
Golang cgo:如何在Go代码中调用C语言代码?
548 0
Golang cgo:如何在Go代码中调用C语言代码?
golang 循环执行定时任务
golang 循环执行定时任务
golang 协程并发代码 demo
golang 协程并发代码 demo
golang 循环创建新协程,发现每次使用的循环变量都一样,都是最后一个
golang 循环创建新协程,发现每次使用的循环变量都一样,都是最后一个
golang 循环创建新协程,发现每次使用的循环变量都一样,都是最后一个
|
Java 程序员 编译器
初窥门径代码起手,Go lang1.18入门精炼教程,由白丁入鸿儒,首次运行golang程序EP01
前文再续,书接上回,前一篇:[兔起鹘落全端涵盖,Go lang1.18入门精炼教程,由白丁入鸿儒,全平台(Sublime 4)Go lang开发环境搭建EP00](https://v3u.cn/a_id_222),我们搭建起了Go lang1.18的开发运行环境,接着就可以运行第一个Go lang1.18程序了,让我们整装待发,开启Go lang1.18的处女航。
初窥门径代码起手,Go lang1.18入门精炼教程,由白丁入鸿儒,首次运行golang程序EP01
|
Go
Golang学习之路(四):Golang的循环语句和循环控制语句
Golang学习之路(四):Golang的循环语句和循环控制语句
94 0
|
存储 编译器 Go
Golang语言循环、指针、结构体和切片(打卡✏️第二天)|Go主题月(下)
Go 语言循环语句 for循环是一个循环控制结构,可以执行指定次数的循环。
257 0
|
编译器 Go
Golang语言循环、指针、结构体和切片(打卡✏️第二天)|Go主题月(上)
Go 语言循环语句 for循环是一个循环控制结构,可以执行指定次数的循环。
162 0
Golang语言循环、指针、结构体和切片(打卡✏️第二天)|Go主题月(上)