
select是go语言中常用的一个关键字,是用来监听和channel有关的IO操作,当 IO 操作发生时,触发相应的动作。
如果有多个case都可以运行,Select会随机公平地选出一个执行。其他不会执行。 (推荐学习:go)
否则:
如果有default子句,则执行该语句。
立即学习“go语言免费学习笔记(深入)”;
如果没有default字句,select将阻塞,直到某个通信可以运行;Go不会重新对channel或值进行求值。
基本用法
//select基本用法
select {
case <- chan1:
// 如果chan1成功读到数据,则进行该case处理语句
case chan2 <- 1:
// 如果成功向chan2写入数据,则进行该case处理语句
default:
// 如果上面都没有成功,则进入default处理流程如果有一个或多个IO操作可以完成,则Go运行时系统会随机的选择一个执行,否则的话,如果有default分支,则执行default分支语句,如果连default都没有,则select语句会一直阻塞,直到至少有一个IO操作可以进行
start := time.Now()
c := make(chan interface{})
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
time.Sleep(4*time.Second)
close(c)
}()
go func() {
time.Sleep(3*time.Second)
ch1 <- 3
}()
go func() {
time.Sleep(3*time.Second)
ch2 <- 5
}()
fmt.Println("Blocking on read...")
select {
case <- c:
fmt.Printf("Unblocked %v later.\n", time.Since(start))
case <- ch1:
fmt.Printf("ch1 case...")
case <- ch2:
fmt.Printf("ch1 case...")
default:
fmt.Printf("default go...")
}运行上述代码,由于当前时间还未到3s。所以,目前程序会走default。
以上就是golang select不阻塞吗的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号