gpt4 book ai didi

go - 可执行程序在跨越空 channel 时抢先退出

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:43 25 4
gpt4 key购买 nike

我最近遇到了一个编码练习,我在 python 中解决了这个问题,我不得不在其中移植一个“算法”。我不知道它是怎么称呼的,这就是我描述它的原因:每个新行都是对前一行的描述,按顺序打印的相同数字和相关数字的数量。这是一个例子:

1
11
21
1211
111221
312211
etc

我开始学习 Go 及其 channel 和并发功能。所以我回到这个练习,试图与 Go 并行更有效地解决它。这是我到目前为止得到的:

package main

func main() {
channel := make(chan uint8)
go treeCalcRoutine(channel, 0)
channel <- 1
close(channel) //defer is not an option in this case because the channel has
//to be closed before main exits
}

func treeCalcRoutine(in <-chan uint8, generation int) {
if generation > 10 {
return // return after 10 recursive iterations
}
out := make(chan uint8)
defer close(out)
num := uint8(1)
previous := <-i
go treeCalcRoutine(out, generation+1)
for val := range in {
switch {
case val == previous:
num++
default:
num = uint8(1)
out <- num
out <- val
}
previous = val
}
out <- num
out <- previous
}

尝试使用 Delve 调试程序时,我发现程序在尝试遍历空/关闭 channel 时无一异常(exception)地退出(并且退出状态为 0)。在这种情况下,我希望程序完全跳过 for 循环。我仍然想自己解决这个挑战,所以如果有人能给我指出正确的方向而不是提供一个有效的解决方案,我将不胜感激。此外,请指出任何其他可以做得更好的问题/案例(例如 generation 限制)。

编辑:由于人们要求我发布错误:由于某种原因根本没有错误。一旦到达 for 循环,程序就会退出。

最佳答案

所以问题实际上不是 for 循环在遇到关闭的 channel 时退出,而是主例程在那个确切的时间退出,这导致所有其他 goroutine 也终止。在这种情况下,有人建议我使用 WaitGroup 。

关于go - 可执行程序在跨越空 channel 时抢先退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51865011/

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