golang_select: select的用法介绍

版权声明:版权声明:本文为博主原创文章,转载请附上博文链接! 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)
	}
}
  1. select只是监听通道,不会阻塞
  2. 在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函数,让其不退出,一直在后台执行​

猜你喜欢

转载自blog.csdn.net/weixin_43851310/article/details/87889272
今日推荐