返回频道Golang

fai*_*_kk 11 go

我正在尝试使用Go频道并与go blog下面的功能示例混淆:

func gen(nums []int) <-chan int {
    out := make(chan int)
    go func() {
        for _, n := range nums {
            out <- n
        }
        close(out)
    }()
    fmt.Println("return statement is called ")
    return out
}
Run Code Online (Sandbox Code Playgroud)

主要:

func main() {
    c := make(chan int)
    c = gen([]int{2, 3, 4, 5})

    // Consume the output.
    // Print 2,3,4,5
    fmt.Println(<-c)
    fmt.Println(<-c)
    fmt.Println(<-c)
    fmt.Println(<-c)
}
Run Code Online (Sandbox Code Playgroud)

完整代码:http://play.golang.org/p/Qh30wzo4m0

我怀疑:

  1. 我的理解是,一旦return被调用,函数将被终止,并且该函数内的通道不再有生命.

  2. return声明只被调用一次.但是out频道的内容被多次阅读.在这种情况下,实际的执行流程是什么?

(我是并发编程的新手.)

Von*_*onC 11

out := make(chan int)
Run Code Online (Sandbox Code Playgroud)

这不是一个缓冲的通道,这意味着out <- n阻塞,直到有人在某处读取该通道(fmt.Println(<-c)通话)
(另请参阅" go golang channels维护顺序 ")

因此,gen()函数末尾的返回并不意味着文字go func()被终止(因为它仍然在等待读者使用out频道的内容).

main函数outgen()函数返回通道.终止
后如何才能获得它gen()

gen()终止对其返回值(out通道)没有影响的事实:" gen()" 的目标是"生成"该out通道.

main终止后可以使用out(作为返回值gen())gen().

字面go funcgen()仍然运行,即使gen()被终止.