for range会一直读取数据直到,chan关闭。无缓冲chan相当于一个开关,不存储数据,同步阻塞类型,如果没有for rang不断读取数据,chan不会有数据不断流入流出
// channel 无缓存类型不能读写值,会同步阻塞,相当于一个开关
func producter(numbs ...int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for _,n := range numbs{
out <- n
}
}()
return out
}
func square(out <-chan int) <-chan int{
in := make(chan int)
go func() {
defer close(in)
for n := range out{
//fmt.Println(n) 验证如果没有rang读取的情况是否阻塞
in <-n*n
}
}()
return in
}
func main() {
out := producter(1,2,3,4)
in := square(out)
i := 0
// range会一直获取数据直到chan关闭
for ret := range in {
i++
fmt.Println(i,ret)
}
//fmt.Println(i,in)
//fmt.Println(i,<-in)
}
1 1
2 4
3 9
4 16
网友评论