这篇主要讲Select这个有用的关键字用来监听管道顺带讲下带缓冲的Channel
带缓冲的Channel
Channel是可以带有缓冲的 c := make(chan int,3) 这么声明则代表这个管道里最多同时可以放三个int类型的数据
如下代码所示
package main
func main() {
c := make(chan int,3)
c <- 1
c <- 1
c <- 1
<span style="white-space:pre"> </span>//c <- 1 如果再加上这一句则会报错 因为无法同时放入四个int类型数据
<- c
<- c
<- c
}
Select
Go提供了select关键字用于监听各个通道
比如我要取通道1中的数据并且是一有数据我就取出来 那我们该如何实现呢
这是就可以借助select 用来监听一旦有数据进来select自动帮你取数据出来 还是挺方便的一个功能
package main
import (
"time"
"fmt"
)
func main() {
o := make(chan int)
c := make(chan int)
go func() {
for {
select {
case a := <- c://监听c管道只要一有数据进来 就打印出来
fmt.Println(a)
//这里After返回 <-chan Time 也就是监听 <-chan Time这个管道
//如果超过5秒钟 如果select一直未收到消息 那么 就会给<-chan Time通道发送一个消息
//每隔5秒就会发送一次
case <- time.After(5 * time.Second):
o <- 0
break //仅仅是跳出select循环并未跳出for循环
}
}
} ()
for i := 0; i<100 ; i++{
c <- i
}
<- o //接收消息
}