登录
首页 >  Golang >  Go问答

可执行文件在空通道上时,如何让其提前退出

来源:stackoverflow

时间:2024-03-06 15:00:27 375浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《可执行文件在空通道上时,如何让其提前退出》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

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

1
11
21
1211
111221
312211
etc

我开始学习 go 的通道和并发特性。所以我回到这个练习,尝试与 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 调试程序时,我发现程序在尝试遍历空/关闭通道时无异常退出(退出状态为 0)。我希望程序在这种情况下完全跳过 for 循环。 我仍然想自己解决这个挑战,所以如果有人能给我指出正确的方向而不是提供一个有效的解决方案,我将不胜感激。此外,请指出任何其他可以做得更好的问题/案例(例如 generation 限制)。

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


解决方案


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

本篇关于《可执行文件在空通道上时,如何让其提前退出》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

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