Skip to content

Instantly share code, notes, and snippets.

@yrong
Created July 13, 2018 08:31
Show Gist options
  • Save yrong/c4181c2c0749391603bcd5046c1361be to your computer and use it in GitHub Desktop.
Save yrong/c4181c2c0749391603bcd5046c1361be to your computer and use it in GitHub Desktop.
multiple select
func main(){
var n int = 10
var chs = make([]chan int, n)
var worker = func(n int, c chan int){
for i:=0;i<n;i++{
c<-i
}
close(c)
}
//不定数量的channel数组
for i:=0;i<n;i++{
chs[i]=make(chan int)
go worker(3+i, chs[i])
}
var selectCase = make([]reflect.SelectCase, n)
//将channel绑定到SelectCase
for i:=0;i<n;i++{
selectCase[i].Dir = reflect.SelectRecv //设置信道是接收,可以为下面值之一
/*
const (
SelectSend SelectDir // case Chan <- Send
SelectRecv // case <-Chan:
SelectDefault // default
)
*/
selectCase[i].Chan = reflect.ValueOf(chs[i])
}
numDone := 0
//从所有channel中取出最先到达的N个值
for numDone < n {
chosen, recv, recvOk := reflect.Select(selectCase)
if recvOk {
fmt.Println(chosen, recv.Int(), recvOk)
numDone++
}else{
fmt.Println("recv error")
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment