最近公司工作有点多,Golang的select进阶就这样被拖沓啦,今天坚持把时间挤一挤,把吹的牛皮补上。
前一篇文章《Golang并发模型:轻松入门select》介绍了select的作用和它的基本用法,这次介绍它的3个进阶特性。
nilfor-selectselect{}
nil
casenilcaseselectselectcasecasenil
func combine(inCh1, inCh2 <-chan int) <-chan int {
// 输出通道
out := make(chan int)
// 启动协程合并数据
go func() {
defer close(out)
for {
select {
case x, open := <-inCh1:
if !open {
inCh1 = nil
continue
}
out<-x
case x, open := <-inCh2:
if !open {
inCh2 = nil
continue
}
out<-x
}
// 当ch1和ch2都关闭是才退出
if inCh1 == nil && inCh2 == nil {
break
}
}
}()
return out
}
如何跳出for-select
breakselectfor-selectconsumeinChinChfor-select
func consume(inCh <-chan int) {
i := 0
for {
fmt.Printf("for: %d\n", i)
select {
case x, open := <-inCh:
if !open {
break
}
fmt.Printf("read: %d\n", x)
}
i++
}
fmt.Println("combine-routine exit")
}
运行结果:
➜ go run x.go
for: 0
read: 0
for: 1
read: 1
for: 2
read: 2
for: 3
gen exit
for: 4
for: 5
for: 6
for: 7
for: 8
... // never stop
breakfor-select
casereturndeferselectforbreakcombinegoto
select{}
select{}
ch := make(chan int)
<-ch
select{}mainmain
select应用场景
select
select