半年前写过一些 go 代码,当时见到过双重 select 技巧,现在忘了,有大哥知道的能说说吗,结构大概是下面这样
func twork(job <-chan string, st <-chan int) {
defer wg.Done()
for {
select {
case s, ok := <-job:
if ok {
fmt.Println("job:", s)
} else {
return
}
case sti, ok := <-st:
if ok {
if sti == 2 {
fmt.Println("return channel")
return
} else if sti == 1 {
fmt.Println("type 1")
continue
}
} else {
return
}
default:
select {
case sti, ok := <-st:
do something
}
}
}
}
查了半天没查到类似的代码,能解释一下应用场景是什么吗
1
mcfog 2022-02-03 19:32:23 +08:00 via Android
谈不上什么技巧,就是用 select 的行为来精确判断处理各种 channel 的状态
顺带如果你贴的代码是完整的,那这个不是什么双层 select ,内层的单分支 select 相当于没 select ,经典冗余代码 |
2
honmaple 2022-02-04 09:31:24 +08:00
go 的 select 没有优先级,多重 select 可以实现简单的优先级
|