我试图熟悉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关键字是危险的,并且始终应与终止条件一起使用的结论是没有根据的。
- 1 回答
- 0 关注
- 143 浏览
添加回答
举报
0/150
提交
取消
