我们先来看看无缓存channel
func main() { var channel = make(chan int, 0) go func() { for i := 0; i <= 2; i++ { channel <- i fmt.Println("发送", i) } }() for i := 0; i <= 2; i++ { num := <-channel fmt.Println("num是", num) } }
我们看一下运行结果
发送 0
num是 0
num是 1
发送 1
发送 2
num是 2
我们发现,在第0轮之后,先打印了num,然后才打印了i
但是如果改变一下发送和打印的顺序
func main() { var channel = make(chan int, 0) go func() { for i := 0; i <= 2; i++ { fmt.Println("发送", i) channel <- i } }() for i := 0; i <= 2; i++ { num := <-channel fmt.Println("num是", num) } }
结果就会变成这样
发送 0
发送 1
num是 0
num是 1
发送 2
num是 2
所以这个主协程和子协程的信息沟通还是很迅速的,看print是不能准确判断阻塞和执行时间的
然后再来看看有缓存的channel
func main() { var channel = make(chan int, 5) go func() { for i := 0; i <= 2; i++ { fmt.Println("发送", i) channel <- i } }() for i := 0; i <= 2; i++ { num := <-channel fmt.Println("num是", num) } }
结果肯定就是
发送 0
发送 1
发送 2
num是 0
num是 1
num是 2
再来看看如果把缓存量改小一点会怎么样
var channel = make(chan int, 1)
var channel = make(chan int, 2)
两种情况也都是
发送 0
发送 1
发送 2
num是 0
num是 1
num是 2
所以缓存还是给channel的信息发送和接收起到了重要的作用