golang中的switch 与select结构上有些相似。
下面是switch 对类型的判断,输出不同的值,我觉得它安顺序执行的
var b interface{}
b = "string"
switch b.(type) {
case string:
fmt.Println("get string")
case int:
fmt.Println("get int")
default:
fmt.Println("default")
}
select 与switch结构上有点相似但它使用与switch是不同的
1. select只能用于chan
2. 进入select中所有的 case都会执行case条件,但是最终中会选择最先接收到信息的case函数体执行.所以select中的default需要考虑一下
实例如下:
a := make(chan bool)
go func(temp chan bool) {
time.Sleep(time.Second * 11)
temp <- true
}(a)
select {
case <-a:
{
fmt.Println("ok")
}
case <-time.After(time.Second * 10):
fmt.Println("10")
// default:
// fmt.Println("default")
}
select 进入时 <- a 阻塞, time.After(time.Second * 10)开始计时,计算首先完成即执行fmt.Println("10")
如果是这样:
a := make(chan bool)
go func(temp chan bool) {
time.Sleep(time.Second * 1)
temp <- true
}(a)
select {
case <-a:
{
fmt.Println("ok")
}
case <-time.After(time.Second * 10):
fmt.Println("10")
// default:
// fmt.Println("default")
}
这样的话select 进入时 <- a 阻塞, time.After(time.Second * 10)开始计时,由于a率先完成,所以执行fmt.Println("ok")
如果是这样:
a := make(chan bool)
go func(temp chan bool) {
time.Sleep(time.Second * 1)
temp <- true
}(a)
select {
case <-a:
{
fmt.Println("ok")
}
case <-time.After(time.Second * 10):
fmt.Println("10")
default:
fmt.Println("default")
}
这样的话select 进入时 <- a 阻塞, time.After(time.Second * 10),default最先收到,所以执行fmt.Println("default")
思考一下下面程序输出什么?:
a := make(chan bool)
a <- true
select {
case <-a:
{
fmt.Println("ok")
}
case <-time.After(time.Second * 10):
fmt.Println("10")
default:
fmt.Println("default")
}
这样程序执行到 a <- true 会出现死锁的现象。