我正在尝试使用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
我怀疑:
我的理解是,一旦return被调用,函数将被终止,并且该函数内的通道不再有生命.
该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函数out从gen()函数返回通道.终止
后如何才能获得它gen()?
gen()终止对其返回值(out通道)没有影响的事实:" gen()" 的目标是"生成"该out通道.
main终止后可以使用out(作为返回值gen())gen().
字面go func内gen()仍然运行,即使gen()被终止.