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



我试图熟悉Go,尝试它的关键字go在飞行中调用子程序。我想知道这个关键字是否有点危险,因为它可能会创建一个危险的无限循环,消耗所有的系统内存,并在几秒钟内崩溃主机,如果不注意的话。

那么让我们假设有人想创建一个递归函数,它多次调用自己来增加计算,它使用go关键字来增加并行计算。如果代码中有一些小错误,它可能会产生一个危险的无限循环。

下面是这个危险的无限循环的例子:

/* WARNING! Running this code will probably crash your system! */
package main
func infinity() {
LOOP:
go infinity()
goto LOOP
}
func main() {
infinity()
}
/* WARNING! Running this code will probably crash your system! */

这段代码在我的机器上7秒内吃掉了大约32gb的系统内存,当没有更多的系统内存可用时,机器只是冻结,似乎没有机会解冻,除了硬重置。

所以你不同意在使用go关键字时总是使用带有中止条件的计数器变量是明智的吗?

所有不终止和分配资源而不释放这些资源的循环都是"危险的";因为它们会耗尽可用的资源(您可以称之为"泄漏")。

无限递归是这种循环的一种情况,即使没有扩展任何程序,也会耗尽最大堆栈大小。

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

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

您的代码泄漏了消耗内存的程序,因此您的代码耗尽了可用内存。这很糟糕,但并不"危险"。潜在的问题不是go关键字,而是内存泄漏。任何分配内存的无限循环(并保持其活动)都将导致相同的行为。

在Go中,泄漏程序比泄漏内存更容易。但是你的go关键字是危险的,总是应该与终止条件一起使用的结论是没有根据的。

最新更新