recursion - 将自身称为 goroutine 的 golang 递归函数无法按预期工作

标签 recursion go goroutine

<分区>

这个递归函数按预期工作(返回 5 行数字 5 到 1):

package main
import (
    "fmt"
)
func recur(iter int) {
    if iter <= 0 {
        return
    }
    fmt.Println(iter)
    recur(iter-1)
}
func main() {
    recur(5)
}

这个没有(只返回 1 行数字 5):

    package main
import (
    "fmt"
)
func recur(iter int) {
    if iter <= 0 {
        return
    }
    fmt.Println(iter)
    go recur(iter-1)
}
func main() {
    recur(5)
}

不同的是,在第二种实现中,function调用自己作为一个goroutine。 (行 go recur(iter-1) )

那么有人可以解释这种行为吗?

最佳答案

如果你让一切都异步,在 main 中就没有什么可以等待的了。您必须显式地等待 go 例程,这样您的程序就不会在递归过程完成之前退出。

使用sync.WaitGroup或类似的同步。示例 ( On Play ):

func recur(iter int, g *sync.WaitGroup) {
    defer g.Done()
    if iter <= 0 {
        return
    }
    fmt.Println(iter)
    go recur(iter-1, g)
}

func main() {
    g := &sync.WaitGroup{}
    runs := 5
    g.Add(runs)
    recur(runs, g)
    g.Wait()
}

关于recursion - 将自身称为 goroutine 的 golang 递归函数无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39554252/

相关文章:

go - 使用for循环遍历 channel 时出现Goroutine死锁

go - 如何停止同一个 goroutine 的 multilpe 之一

c++ - 数组 : mathematical sequence

algorithm - 递归谜题

javascript - 如何使用 go buffalo 框架渲染 quill js 内容

go - 未定义 : function (declared in another package)

asynchronous - 戈朗 : Why does increasing the size of a buffered channel eliminate output from my goroutines?

recursion - 递归可区分联合和映射

java - 使用java扩展基于OCCURS子句的COBOL copybook

rest - Go gorilla 记录每个请求持续时间和状态码