登录
首页 >  Golang >  Go问答

Go 是否有“无限调用堆栈”等价物?

来源:Golang技术栈

时间:2023-03-25 17:05:51 250浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《Go 是否有“无限调用堆栈”等价物?》带大家来了解一下Go 是否有“无限调用堆栈”等价物?,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

我是 Go 的新手,来自 Node.JS。

在 Node 中,如果我运行这个:

function run(tick = 0) {
  if (tick 

由于超出了最大调用堆栈大小,程序将崩溃。

如果我在 Go 中这样做:

package main

import "fmt"

func run(tick int) (int) {
    if (tick 

这将运行并打印0到标准输出。

我的问题是:

  • 是否有超过我给出的 Go 示例会失败的最大调用次数?
  • 这样的代码是 Go 中的反模式吗?

正确答案

在 Go 中,goroutine 没有固定的堆栈大小。相反,它们从小开始(大约 4KB),并在需要时增长/缩小,似乎给人一种“无限”堆栈的感觉(当然它不可能是真正的无限)。

是的,有一个限制。但是这个限制不是来自调用深度限制,而是来自堆栈内存限制。此限制由 Go 运行时强制执行,但通常为数百 MB(甚至是 GB)。在 Go Playground 上,它是 250MB,可以在这个Go Playground Example上看到。

在我的本地 Linux 64 位机器上,它是 1 GB。

推荐阅读:[Dave Cheney:为什么 Goroutine 的栈是无限的?](https://dave.cheney.net/2013/06/02/why-is-a-goroutines-stack- infinite)

回到你的例子:增加最大递归调用1e9将耗尽堆栈:

if (tick 

这将导致:

runtime: goroutine stack exceeds 1000000000-byte limit
fatal error: stack overflow

runtime stack:
runtime.throw(0x4b4730, 0xe)
        /usr/local/go/src/runtime/panic.go:619 +0x81
runtime.newstack()
        /usr/local/go/src/runtime/stack.go:1054 +0x71f
runtime.morestack()
        /usr/local/go/src/runtime/asm_amd64.s:480 +0x89

goroutine 1 [running]:
main.run(0xffffde, 0x0)
        /home/icza/gows/src/play/play.go:5 +0x62 fp=0xc440088370 sp=0xc440088368 pc=0x483262
main.run(0xffffdd, 0x0)
        /home/icza/gows/src/play/play.go:7 +0x36 fp=0xc440088390 sp=0xc440088370 pc=0x483236
main.run(0xffffdc, 0x0)
...

今天关于《Go 是否有“无限调用堆栈”等价物?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>