通道有两种,一种是带缓存的;另一种是不带缓存的;带缓存的通道,只要缓存还没有满,通道就不会阻塞;不带缓存的通道,是阻塞的。下面用一个例子来说明:
package main
import (
"time"
"fmt"
)
func main() {
dataChannel := make(chan int, 1)
exitChannel := make(chan bool)
defer close(dataChannel)
defer close(exitChannel)
go func(data <- chan int, exit <- chan bool) {
for {
select {
case <- data:
v := <- data
fmt.Printf("销售数据: %d\n", v)
case <- exit:
fmt.Println("线程退出")
break
default:
time.Sleep(100*time.Millisecond)
}
}
}(dataChannel, exitChannel)
data := 1
for i := 0; i < 20; i++ {
fmt.Println("生产数据: ", data)
dataChannel <- data
data++
time.Sleep(1*time.Second)
}
exitChannel <- true
fmt.Println("程序结束")
}
从打印的结果来看,当数据通道dataChannel满的时候,就阻塞了(dataChannel通道带了一个缓存)。很直观