本文将详细解释GO不支持循环引用的原因。边肖觉得挺实用的,就分享给大家参考。希望你看完这篇文章能有所收获。
其中一点就是包的循环引用的报错:
package命令行参数
importsgithub.com/eddycjy/awesome-project/a
importsgithub.com/eddycjy/awesome-project/b
Importgithub.com/eddycjy/awesome-project/a:进口公司突然变得非常困惑。为什么Go不支持包之间的循环引用?这很令人费解。还会影响性能吗?
下图:
今天炸鱼就跟大家分享一下背后的原因。
00-1010这里我们做一个基础案例Demo,方便从未接触过的同学建立初步认知。我们的程序分别有两个包。
package a 的代码如下:
导入(
github.com/eddycjy/awesome-project/b '
)
FuncHello(s string){ 0
b.打印
}package b 的代码如下:
导入(
fmt '
github.com/eddycjy/awesome-project/a '
)
FuncHello(){ 0
A.你好(“我脑袋里的炸鱼”)
}
functprint(s string){ 0
fmt。打印
}然后调用main.go文件中的a.Hello('我心目中的炸鱼')方法。
一运行,就会出现如下错误提示:
包命令行参数
进口github.com/eddycjy/awesome-project/a
进口github.com/eddycjy/awesome-project/b
不允许github.com/eddycjy/awesome-project/a:进口周期
错误的本质原因是a包引用b包,b包引用a包,导致循环引用。
这在Go语言中是被禁止的,程序在编译过程中会被中断,导致编译失败。
00-1010按照Go官方的统一意见,循环导入包几乎是不可能的,甚至Go2也被明确拒绝。
因为Go2可能是打破和改变很多核心问题的关键节点,很多人提出了类似 《proposal: Go 2: allow import cycle》 's,的建议,希望解决周期引入的问题。
围棋之父罗布派克亲自回答了这个问题,原因如下:.
没有支持循环引用:的目的是迫使围棋程序员更多地考虑程序依赖性。
保持依赖图简单。
快速程序构建。
如果支持循环引用:很容易导致懒惰,不良的依赖管理和缓慢的建设。这是设计师不想看到的。
混乱的依赖。
程序构建缓慢。
因此,考虑到一开始就应该维护依赖图的正确DAG,Rob Pike认为这是一个值得提前简化的领域。
在Go程序中做import loop可能很方便,但背后的成本可能是灾难性的,会对Go的构建性能和依赖性产生非常负面的影响。
因此,明确禁止在Go中支持。
这篇关于“GO不支持循环引用的原因是什么”的文章已经分享到这里了,希望。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/60758.html