版权声明:版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/weixin_43851310/article/details/87889272
select
作用:
可以监听多个通道,不会阻塞(同switch)
场景:如果监听到数据通道有值就打印,如果监听到退出开关有值就退出
func main() {
c:=make(chan int) //数据通道
quit:=make(chan bool) //退出开关
//子go程写数据
go func() {
for i:=1;i<=5 ;i++ {
c<-i //将i写入通道
time.Sleep(time.Second)
}
quit<-true //退出开关
}()
//主go程读数据
for {
select{ //用来监听通道
case num:=<-c:
fmt.Println("读取到",num)
case <-quit:
return ;
}
time.Sleep(time.Second)
}
}
- select只是监听通道,不会阻塞
- 在select中不用设置default,防止忙轮训在select中不用设置default,防止忙轮训
select实现超时退出
场景:有时候会出现go程阻塞的情况,可以利用select来设置超时,避免整个程序进入阻塞
func main() {
c:=make(chan int)
quit:=make(chan bool)
go func() {
for {
select{
case num:=<-c:
fmt.Println(num)
case <-time.After(time.Second*2):
fmt.Println("超时退出")
quit<-true
}
}
}()
<-quit
}
空的select可以阻塞 main 函数
func main() {
go func() {
for{
fmt.Println("Golang")
}
}()
select { //阻塞
}
}
此处的select{}会阻塞main函数,让其不退出,一直在后台执行