无缓冲通道(unbuffered channel)是指在接收前没有能力保存任何值的通道,在之前的例子中使用的都是无缓冲通道,需要注意的是,对于无缓冲通道而言,不管是往通道里写数据还是从通道里读数据,都会造成阻塞,并且通过len或者cap函数,得到的结果都为0,看下面的例子
package main import (
"time"
"fmt"
) func main() { ch := make(chan int, )//0代表的是容量 go func() {
for i := ; i< ; i++{
fmt.Println("子协程:i = ", i)
ch <- i //往通道里写内容
}
}() time.Sleep(*time.Second) for i:=;i<;i++ {
num := <-ch //读通道内的内容,没有内容则阻塞,
fmt.Println("主协程: num = ", num)
}
}
执行的结果为
子协程:i =
主协程: num =
子协程:i =
子协程:i =
主协程: num =
主协程: num =
对于结果的理解
1、主协程通道处于无值状态,那么它则阻塞
2、先打印,对通道进行赋值0
3、通道有值0,立刻取值执行打印,这样就有了前两行的结果
4、在主协程取值并执行打印并再次取通道值的远程中,它都是处于阻塞的状态下,子协程直接执行了两次循环并向通道写入两个值
5、主协程打印后看到通道里有值立刻取值并进行打印,在此之前子协程已经执行完毕
6、主协程执行两次循环,执行两次打印
关于无缓冲通道值传递的阻塞,看下页,除了图1和图6,其它时间,两边都是阻塞的