我正在尝试使用Go通道,并对来自Go博客的以下函数示例感到困惑:
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
}
主要:
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)
}
完整的代码:http://play.golang.org/p/Qh30wzo4m0
我的疑惑:
我理解的是,一旦调用了
return
语句,函数就会终止,该函数内部的通道将无法再被使用。return
语句只会被调用一次。但是out
通道的内容会被多次读取。在这种情况下,实际的执行流程是什么?
(我对并发编程还不太熟悉。)