go channel select语句 case default

本文介绍了 Go 语言中的 select 语句,用于处理并发通信。示例展示了如何在多个 channel 之间切换,当有多个 case 可运行时,select 会随机公平选择。在案例中,一个协程通过 c1 发送斐波那契数列,主程序接收并检查数值,超过一定值则通过 c2 结束协程。默认 case 用于插入延迟,使得输出更易观察。
摘要由CSDN通过智能技术生成

参考https://www.runoob.com/go/go-select-statement.html
以下描述了 select 语句的语法:

  1. 每个 case 都必须是一个通信
  2. 所有 channel 表达式都会被求值
  3. 所有被发送的表达式都会被求值
  4. 如果任意某个通信可以进行,它就执行,其他被忽略。
  5. 如果有多个 case 都可以运行,Select 会随机公平地选出一个执行。其他不会执行。
  6. 否则:
    如果有 default 子句,则执行该语句。
    如果没有 default 子句,select 将阻塞,直到某个通信可以运行;Go 不会重新对 channel 或值进行求值。
func main() {
	c1 := make(chan int)
	c2 := make(chan int)
	go p(c1, c2)
	for {
		num := <-c1
		fmt.Println(num)
		if num > 100 {
			c2 <- 0
			break
		}
	}
}

func p(c1 chan int, c2 chan int) {
	x, y := 1, 1
	for {
		select {
		case c1 <- x:
			x, y = y, x+y
		case <-c2:
			return
		// default代码块可以删除
		default:
			fmt.Println(time.Now().UTC())
			time.Sleep(time.Millisecond*100)
		}
	}
}

输出:
1
2022-09-04 12:08:42.8013056 +0000 UTC
1
2022-09-04 12:08:42.9110186 +0000 UTC
2
2022-09-04 12:08:43.0228097 +0000 UTC
3
2022-09-04 12:08:43.1273831 +0000 UTC
5
2022-09-04 12:08:43.2455167 +0000 UTC
2022-09-04 12:08:43.355908 +0000 UTC
8
13
2022-09-04 12:08:43.4634609 +0000 UTC
21
2022-09-04 12:08:43.5837671 +0000 UTC
2022-09-04 12:08:43.6964928 +0000 UTC
34
2022-09-04 12:08:43.8034457 +0000 UTC
55
2022-09-04 12:08:43.9044702 +0000 UTC
89
2022-09-04 12:08:44.0162425 +0000 UTC
144
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值