一、什么是循环依赖

如图所示:循环依赖指的是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 ,因此形成了循环依赖。