gpt4 book ai didi

go - go语言中的递归函数

转载 作者:IT老高 更新时间:2023-10-28 13:06:56 25 4
gpt4 key购买 nike

我几天前开始学习 Go 语言。当我尝试开始编写一些有趣的代码时,我被一种奇怪的行为所困扰。

package main

import "fmt"

func recv(value int) {
if value < 0 {
return
}

fmt.Println(value)
go recv(value-1)
}

func main() {
recv(10)
}

当我运行上面的代码时,只打印了 10。当我在调用 recv 之前删除 go 时,会打印出 100。我相信我在这里误用了 goroutine,但我不明白为什么以这种方式启动 goroutine 失败。

最佳答案

当 main 函数返回时,Go 不会等待任何仍然存在的 goroutine 完成,而是直接退出。

recv在第一次“迭代”后会返回main,因为main没有更多的事情要做,程序会终止。

解决这个问题的一个方法是有一个 channel 来表示所有工作都已完成,如下所示:

package main

import "fmt"

func recv(value int, ch chan bool) {
if value < 0 {
ch <- true
return
}

fmt.Println(value)
go recv(value - 1, ch)
}

func main() {
ch := make(chan bool)
recv(10, ch)

<-ch
}

这里,recv 将在返回之前发送一个 bool 值,main 将在 channel 上等待该消息。

对于程序的逻辑,你使用什么类型或具体值并不重要。 booltrue 只是一个简单的例子。如果您想提高效率,使用 chan struct{} 而不是 chan bool 将节省额外的字节,因为空结构不使用任何内存。

关于go - go语言中的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13338281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com