select case 主要用于对 channel 进行控制
和我们常用的switch case
语句类似,但是 select case 的 case 是在channel处于就绪态
才会执行
case 后面必须跟的是 channel 相关的表达式
如:
ch <- -- 读取
val:=<-ch -- 写入
什么是就绪态呢
总言而之,channel 处于非阻塞就是就绪态
举一个简单的例子
package main
import (
"fmt"
"time"
)
func SelectCaseFunc(ch chan int) {
for {
select {
case val := <-ch:
fmt.Println("接收到值为:", val)
return
case ch <- 666:
fmt.Println("channel往里面置入了值")
default:
fmt.Println("上面channel都不位于就绪态, 暂时跳过")
}
time.Sleep(time.Millisecond * 500)
}
}
func main() {
ch := make(chan int, 1)
SelectCaseFunc(ch)
}
我们来分析一下这段程序
select
package main
import (
"fmt"
)
func main() {
ch1 := make(chan int, 1)
ch2 := make(chan int, 1)
ch1 <- 1
ch2 <- 2
select {
case v := <-ch1:
fmt.Println("从 ch1 读取到:", v)
case v := <-ch2:
fmt.Println("从 ch2 读取到:", v)
default:
fmt.Println("都不就绪")
}
}
ch1 和 ch2 都是缓冲通道,且都有值。select 中两个 case 都是 读操作,都满足“就绪态”。
那么:
答案:
都处于就绪态
会随机选,所以既会输出从 ch1 读取:1 也会从 ch2 读取:2
不一定一样,不确定
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int)
go func() {
time.Sleep(1 * time.Second)
ch <- 1
}()
select {
case v := <-ch:
fmt.Println("收到:", v)
case <-time.After(500 * time.Millisecond):
fmt.Println("超时退出")
}
}
答案
超时退出
每次都一样
因为 1 秒过后 ch 才进入就绪态,但是 500ms 就已经进入第二个 case 超时退出了
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。