为了账号安全,请及时绑定邮箱和手机立即绑定

带有 go 的递归函数调用是否危险?

带有 go 的递归函数调用是否危险?

Go
叮当猫咪 2022-08-15 16:20:58
我试图熟悉Go,尝试它是动态调用子例程的关键字。我想知道这个关键字使用起来是否有点危险,因为它可能会创建一个危险的无限循环,如果没有被注意到,它会消耗所有系统内存并在几秒钟内使主机崩溃。go因此,让我们假设有人想要创建一个递归函数,该函数多次调用自己并增加计算,它使用关键字来增加并行计算。如果代码中有一些小错误,它可能会产生一个危险的无限循环。go下面是这个危险的无穷大循环的一个例子。/* WARNING! Running this code will probably crash your system! */package mainfunc infinity() {    LOOP:    go infinity()    goto LOOP}func main() {    infinity()}/* WARNING! Running this code will probably crash your system! */此代码在我的机器上7秒内消耗了大约32gb的系统内存,当没有更多的系统内存可用时,机器只是冻结,除了硬重置之外,似乎没有机会解冻。那么,难道您不同意在使用关键字时始终使用带有中止 criterium 的反变量是明智的吗?go
查看完整描述

1 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

所有不终止和分配资源的循环在没有释放这些资源的情况下都是“危险的”,因为它们会耗尽可用资源(你可以称之为“泄漏”)。

无限递归就是这样一个循环的情况,即使没有跨越任何goroutines,因为最大堆栈大小也会耗尽。

这样的循环(直接或通过递归)是编程错误。

这样的循环并不“危险”,它们只是耗尽了泄漏的资源,并且,根据资源和底层操作系统,这将导致故障或程序终止。

您的代码会泄漏消耗内存的 goroutine,从而导致您的代码耗尽可用内存。这很糟糕,但并不“危险”。根本问题不是关键字,而是内存泄漏。任何分配内存(并使其保持活动状态)的无限循环都将导致相同的行为。go

在 Go 中,泄漏 goroutines 比泄漏内存更容易。但是,您认为go关键字是危险的,并且始终应与终止条件一起使用的结论是没有根据的。


查看完整回答
反对 回复 2022-08-15
  • 1 回答
  • 0 关注
  • 143 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号