一、什么是循环依赖
如图所示:循环依赖指的是A依赖B,B也同时依赖A
如果你原来是Java程序员,那么你必须知道Go中的循环依赖问题,因为,说不定什么时候,我们就犯糊涂写了个循环依赖。
二、Go中的循环依赖
我们首先看一段简单的代码:
写一个简单的service,定义一个IUser结构体,和一个获取全局用户的方法LoadGlobalUser(),然后方法内部调用用户的初始化器进行初始化,最后返回,位于package service
package service
import "gateway/initializer"
type IUser struct {
Name string
}
func LoadGlobalUser() *IUser{
user :=new(IUser)
initializer.InitializeUser(user)
return user
}
下面是初始化的函数,位于package initializer
package initializer
import "gateway/service"
func InitializeUser(user *service.IUser) {
user.Name = "laowang"
// 可能需要做很多事情
}
main.go调用
package main
import (
"fmt"
"gateway/service"
)
func main() {
user := service.LoadGlobalUser()
fmt.Println(user)
}
作为一个Java程序员,我感觉没毛病啊,但是执行后却编译不通过
package gateway
imports gateway/service
imports gateway/initializer
imports gateway/service: import cycle not allowed
通过错误信息,可以看出,service包依赖initializer包,initializer包又依赖service包,最终导致了循环依赖错误:import cycle not allowed
分析:在Go语言中,循环依赖指的是包与包之间的依赖关系,其实就 package A 引入了 package B ,然后 package B 又引入了 package A ,因此形成了循环依赖。