预先不知道channel里消息会有多少的话,我认为可以通过判断超时的方式来进行判断
因为这里定义的是无缓冲channel,所以第一个for循环必须启一个协程,要不然就阻塞在那里了
func main(){
r := make(chan int)
go func() {
for n := 0; n < 100000; n++ {
go func(x int, r chan int) {
if x%3 == 0 && x%23 == 0{
r <- x
}
}(n, r)
}
}()
for{
select {
case i := <- r:
fmt.Println(i)
case <- time.After(time.Second*3):
fmt.Printf("time out")
goto out
}
}
out:
fmt.Printf("end")
}
也可以加一个chan来判断结束,不过并没有验证严谨性,仅供参考
func main(){
r := make(chan int)
quit := make(chan int)
go func() {
for n := 0; n < 100000; n++ {
go func(x int, r chan int) {
if x%3 == 0 && x%23 == 0{
r <- x
}
}(n, r)
}
quit <- 1
}()
for{
select {
case i := <- r:
fmt.Println(i)
case <- quit:
fmt.Println("quit")
goto out
}
}
out:
fmt.Printf("end")
}