Concurrency 以下是golang代码死锁。有人能帮助理解为什么吗?

Concurrency 以下是golang代码死锁。有人能帮助理解为什么吗?,concurrency,go,Concurrency,Go,这个例子取自。它运行并给出正确答案,但它显示以下运行时错误:“致命错误:所有goroutines都处于休眠状态-死锁!”。有人能帮我理解为什么会这样吗? 包干管 import ( "fmt" ) func gen(nums ...int) <- chan int { out := make(chan int) go func() { for _, n := range nums { out <- n }

这个例子取自。它运行并给出正确答案,但它显示以下运行时错误:“致命错误:所有goroutines都处于休眠状态-死锁!”。有人能帮我理解为什么会这样吗? 包干管

import (
    "fmt"
)

func gen(nums ...int) <- chan int {
    out := make(chan int)
    go func() {
        for _, n := range nums {
            out <- n
        }
    }()
    return out
}

func sq(in <- chan int) <- chan int {
    out := make(chan int)
    go func() {
        for n := range in {
            out <- n * n
        }
        close(out)
    }()
    return out
}

func main() {
    for n := range sq(gen(2,3)) {
        fmt.Println(n)
    }
}
导入(
“fmt”
)

func-gen(nums…int)函数的
sq()
中的
n:=范围永远不会退出,并开始阻塞(读取2个值后),因为
gen()
从未关闭其通道。
close(out)
添加到
gen()
go func
将使其工作:

对于信道,接收器阻塞,直到接收到一个值。
.

sq()

在第二个示例中,
main()
本身退出,这意味着即使
sq()
被阻止,一切仍然停止

func main() {
    // Set up the pipeline.
    c := gen(2, 3)
    out := sq(c)

    // Consume the output.
    fmt.Println(<-out) // 4
    fmt.Println(<-out) // 9
}