package mainimport ( "time" "fmt")//向管道放入80000个数func createData(size int, intDataChan chan int) { if size < 1 { return } for i := 1; i <= size; i++ { intDataChan <- i } close(intDataChan)}func getSuShu(intDataChan chan int, primeChan chan int, exitChan chan bool) { var flag bool for { time.Sleep(time.Millisecond * 10) num, ok := <- intDataChan if !ok {//取不到数据 break } flag = true //假设是素数 for i := 2; i <= num /2; i++{ if num % i == 0 { flag = false //确定不是素数 break } } if flag { primeChan <- num } } fmt.Println("\n 有一个协程取不到数据,退出") exitChan <- true //标记退出}func main() { var maxInt = 8000 intDataChan := make(chan int, 1000) primeChan := make(chan int, maxInt / 3) exitChan := make(chan bool, 4) go createData(maxInt, intDataChan) for i := 0; i < 4; i++ { go getSuShu(intDataChan, primeChan, exitChan) } go func() { for i := 0; i < 4; i++ { <- exitChan //阻塞直到四个协程都完成工作 } close(primeChan)//关闭管道 }() for { res, ok := <- primeChan if !ok { break } fmt.Print(res, " ") }}