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)
 }
相关文章
|
2月前
|
Go
Golang语言之包依赖管理
这篇文章详细介绍了Go语言的包依赖管理工具,包括godep和go module的使用,以及如何在项目中使用go module进行依赖管理,还探讨了如何导入本地包和第三方库下载的软件包存放位置。
33 3
|
3月前
|
测试技术 Go
写出高质量代码的秘诀:Golang中的测试驱动开发(TDD)
写出高质量代码的秘诀:Golang中的测试驱动开发(TDD)
|
3月前
|
存储 大数据 测试技术
掌握 GoLang 中的指针:高效代码的提示和技巧
掌握 GoLang 中的指针:高效代码的提示和技巧
|
3月前
|
测试技术 Go
在Golang中优化你的代码以提高性能的5个技巧
在Golang中优化你的代码以提高性能的5个技巧
|
3月前
|
存储 测试技术 Go
Golang 包:构建模块化代码的基石
【8月更文挑战第31天】
41 0
|
4月前
|
Serverless Go C语言
函数计算产品使用问题之如何在Golang运行时环境中解决glibc依赖问题
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3月前
|
人工智能 安全 Go
Golang 搭建 WebSocket 应用(八) - 完整代码
Golang 搭建 WebSocket 应用(八) - 完整代码
40 0
|
6月前
|
Go 开发者
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
【4月更文挑战第21天】本文介绍了Go语言中的流程控制语句,包括`if`、`switch`和`for`循环。`if`语句支持简洁的语法和初始化语句,但需注意比较运算符的使用。`switch`语句提供多分支匹配,可省略`break`,同时支持不带表达式的形式。`for`循环有多种形式,如基本循环和`for-range`遍历,遍历时修改原集合可能导致未定义行为。理解并避免易错点能提高代码质量和稳定性。通过实践代码示例,可以更好地掌握Go语言的流程控制。
50 3
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
|
6月前
|
存储 Go
Golang深入浅出之-Go语言依赖管理:GOPATH与Go Modules
【4月更文挑战第27天】Go语言依赖管理从`GOPATH`进化到Go Modules。`GOPATH`时代,项目结构混乱,可通过设置多个工作空间管理。Go Modules自Go 1.11起提供更现代的管理方式,通过`go.mod`文件控制依赖。常见问题包括忘记更新`go.mod`、处理本地依赖和模块私有化,可使用`go mod tidy`、`replace`语句和`go mod vendor`解决。理解并掌握Go Modules对现代Go开发至关重要。
111 2
|
测试技术 Go
Golang 语言怎么编写测试代码?
Golang 语言怎么编写测试代码?
52 0