此递归函数按预期工作(返回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)
}这个没有(只返回数字5的一行):
package main
import (
"fmt"
)
func recur(iter int) {
if iter <= 0 {
return
}
fmt.Println(iter)
go recur(iter-1)
}
func main() {
recur(5)
}区别在于,在第二个实现中,函数称自己为一个goroutine。( go recur(iter-1)行)
有人能解释一下这种行为吗?
发布于 2016-09-18 05:00:49
如果使所有内容都是异步的,那么main中就没有什么可等待的了。您必须显式地等待go例程,这样您的程序就不会在递归过程结束之前退出。
使用sync.WaitGroup或类似的东西进行同步。示例(论游戏):
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()
}发布于 2016-09-18 05:01:27
你的程序还没完成就已经退出了。查看这项工作的最简单方法如下所示。
package main
import (
"fmt"
"time"
)
func recur(iter int) {
if iter <= 0 {
return
}
fmt.Println(iter)
go recur(iter - 1)
}
func main() {
recur(5)
time.Sleep(time.Second)
}但是,您可能希望将一个sync.WaitGroup传递到您的函数,而不是休眠。
https://stackoverflow.com/questions/39554252
复制相似问题