Created
July 13, 2018 08:31
-
-
Save yrong/c4181c2c0749391603bcd5046c1361be to your computer and use it in GitHub Desktop.
multiple select
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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