go语言select语句

本文详细介绍了Go语言中的select语句,包括其基本用法、随机执行case的特性以及阻塞与非阻塞行为。通过示例展示了如何使用select与channel进行通信,并探讨了default语句的作用。此外,还讨论了在没有case可运行时如何处理,以及default语句如何确保在特定情况下被执行。
摘要由CSDN通过智能技术生成
go语言select语句

select会选择一个可运行的case(每个case都必须是一个通信)运行。

	chan1, chan2 := make(chan int, 1), make(chan int, 1)
	select {
	case chan1 <- 1:
		fmt.Println("run chan1<-1")
	case <-chan2:
		fmt.Println("<-chan2")
	}
/*
输出:run chan1<-1
*/

若有多个可运行的case语句则随机执行一个。

	chan1, chan2 := make(chan int, 1), make(chan int, 1)
	select {
	case chan1 <- 1:
		fmt.Println("run chan1<-1")
	case chan2 <- 2:
		fmt.Println("run chan2<-2")
	}
/*
随机输出run chan1<-1或run chan2<-2
*/

如果没有 case 可运行且没有default,它将阻塞,直到有 case 可运行。

func selectFun(chan1 chan int, chan2 chan int) {
	time.Sleep(time.Second)
	chan1 <- 1
}

func main() {
	chan1, chan2 := make(chan int, 1), make(chan int, 1)
	go selectFun(chan1, chan2)
	select {
	case <-chan1:
		fmt.Println("run <-chan1")
	case <-chan2:
		fmt.Println("run <-chan2")
	default:
		fmt.Println("run default")
	}
}
/*
过一秒后输出: run <-chan1
*/

有default语句时运行default的内容

func selectFun(chan1 chan int, chan2 chan int) {
	time.Sleep(time.Second)
	chan1 <- 1
}

func main() {
	chan1, chan2 := make(chan int, 1), make(chan int, 1)
	go selectFun(chan1, chan2)
	select {
	case <-chan1:
		fmt.Println("run <-chan1")
	case <-chan2:
		fmt.Println("run <-chan2")
	default:
		fmt.Println("run default")
	}
}
/*
输出:run default
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值