首页>>后端>>Golang->为什么 go 不支持循环引用

为什么 go 不支持循环引用

时间:2023-11-30 本站 点击:0

什么是循环引用?

循环引用是 go 语言开发工程师经常会遇到的一个问题。所谓的循环引用,就是在 A 包中引用 B 包,B 包引入 C 包,而在 C 包中又引入了 A 包,在项目编译时,就会报循环引用错误,注意是错误而非警告。

我们要实际演示一下:talk is easy, show me the code

我们定义三个文件 HelloA,HelloB 和 HelloC。

packageAimport("fmt""go_learn/C")funcHelloA(){C.HelloC()fmt.Println("packageAhello")}
packageBimport("fmt""go_learn/A")funcHelloB(){A.HelloA()fmt.Println("packageBhello")}
packageCimport"C"import("fmt""go_learn/B")funcHelloC(){B.HelloB()fmt.Println("packageChello")}
packagemainimport("go_learn/A")funcmain(){A.HelloA()}

然后执行一下 main 函数,发现抛如下错误:

packagego_learnimportsgo_learn/Aimportsgo_learn/Cimportsgo_learn/Bimportsgo_learn/A:importcyclenotallowed

由此可见,循环引用在 go 中被归结为错误!

为什么 go 不支持循环引用?

对于这个问题,Go 语言之父 Rob Pike 曾做过解答,他认为:

循环引用的代码设计是不合理的,没有很好的考虑代码的结构;

*没有支持循环引用,目的是迫使 Go 程序员更多的考虑程序的依赖关系,保持依赖关系图的整洁;*

同时可以使项目快速构建。

循环引用有什么弊端?

首先,循环引用肯定会导致缓慢的程序构建。

其次,如果项目中存在循环引用,那么模块和模块之间就存在相互的调用,随着项目的推进,模块之间的依赖关系会越来越多,最后导致两个模块耦合性变得越来越高,最初之间的界限变得越来越模糊,最后都耦合在一起,变得一团糟。

另外,循环引用还有可能会导致无限递归,继而引发其它问题。

如何避免循环引用?

很重要的一点是:设计好代码结构!!!

参考文档

为什么 Go 不支持循环引用?

为什么Go语言不允许循环引入?


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Golang/4590.html