预先不知道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")
}