上一篇文章讲了 协程与管道
这篇主要讲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 //接收消息 }
有疑问加站长微信联系(非本文作者)