Go 在空通道上测距时以抢占方式退出的可执行文件

Go 在空通道上测距时以抢占方式退出的可执行文件,go,concurrency,range,channel,Go,Concurrency,Range,Channel,我最近遇到了一个我用python解决的编码练习,其中我必须移植一个“算法”。我不知道它是如何命名的,这就是为什么我要描述它: 每一新行都是前一行的描述,按顺序打印的相同数量和相关编号。 以下是一个例子: 1 11 21 1211 111221 312211 etc 我开始学习Go的通道和并发特性。因此,我回到这个练习中,试图在使用围棋的同时更有效地解决它。 到目前为止,我得到的是: package main func main() { channel := make(chan uin

我最近遇到了一个我用python解决的编码练习,其中我必须移植一个“算法”。我不知道它是如何命名的,这就是为什么我要描述它: 每一新行都是前一行的描述,按顺序打印的相同数量和相关编号。 以下是一个例子:

1
11
21
1211
111221
312211
etc
我开始学习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
}
主程序包
func main(){
通道:=制造(通道uint8)
go treeCalcRoutine(通道,0)

通道因此问题实际上不是for循环遇到闭合通道时退出,而是主例程在该时间退出,这导致其他所有goroutine也终止。在这种情况下,建议我使用waitgroups。

请发布实际错误和触发它的行。for没有错误“在空通道上测距”-它只是等待有东西接收。为什么
可以关闭(通道)
作为
main
中的最后一句话,你做了什么?我想你对频道有一些基本的误解。@JimB据我所知,除非频道关闭,
for range
循环将永远不会停止循环。@swiftby不,不是这样。关闭频道将关闭频道,在这种情况下,你无法发送更多的值在关闭的通道上,编译器将抛出一个错误,说明无法在关闭的通道上发送值。@Swiftb0y:关闭通道将导致for范围循环退出,但在
main
的末尾,程序将退出,因此这并不重要。