select块

select块是为channel特殊设计的语法,它和switch语法非常相近。分支上它们都可以有多个case块和做多一个default块,但是也有很多不同.

特性

  • 包含默认分支和候选分支
  • 候选分支中的case表达式都会在该语句执行开始时先被求值,并且求值的顺序是依从代码编写的顺序从上到下的
  • select 到 括号{之间不得有任何表达式
  • fallthrough关键字不能用在select里面
  • 所有的case语句要么是channel的发送操作,要么就是channel的接收操作
  • select里面的case语句是随机执行的,而不能是顺序执行的。设想如果第一个case语句对应的channel是非阻塞的话,case语句的顺序执行会导致后续的case语句一直得不到执行除非第一个case语句对应的channel里面的值都耗尽了。
  • 如果所有case语句关联的操作都是阻塞的,default分支就会被执行。
  • 如果没有default分支,当前goroutine就会阻塞,当前的goroutine会挂接到所有关联的channel内部的协程队列上。 所以说单个goroutine是可以同时挂接到多个channel上的,甚至可以同时挂接到同一个channel的发送协程队列和接收协程队列上。
  • 当一个阻塞的goroutine拿到了数据解除阻塞时,它会从所有相关的channel队列中移除
  • select{}即一直阻塞,单线程时,会deadlock

测试

package main

import "fmt"

func main()  {
	ch1 := make(chan int, 2)
	ch1 <- 1
	select {
	case ch1 <- 1:
		fmt.Println("run this 1")
	case <- ch1:
		fmt.Println("run this 2")
	default:
		fmt.Println("run this default")
	}
}
第一次运行输出:
run this 1
第二次运行输出
run this 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值