Golang-素数案例应用
package main
import "fmt"
func pushNum(intChan chan int) {
for i := 1; i < 2000; i++ {
intChan <- i
}
close(intChan)
}
func getNum(intChan chan int, getChan chan int, exitChan chan bool) {
for {
num, ok := <-intChan
if ok != true {
break // 取不到了
}
// 假设找到的是素数
var flag bool
// 剔除不是素数 的数
flag = true
for i := 2; i < num; i++ { //
if num%2 == 0 {
// 找素数的标志
flag = false
break
}
}
if flag {
getChan <- num // 素数给getChan
}
}
fmt.Println("有一个getChan协程取不到数据,退出")
// 这里不能关闭 getChan
//exitChan 写入true
exitChan <- true
}
func main() {
intChan := make(chan int,1000)
getChan := make(chan int,2000)
exitChan := make(chan bool ,4)
go pushNum(intChan)
for i:=1;i<=4 ;i++ {
go getNum(intChan,getChan,exitChan)
}
// 这里是我们的主线程,进行处理
go func() {
for i:=1;i<=4 ;i++ {
<-exitChan
}
// 当我们从exitChan 取出了4个结果,既可以关闭getChan
close(getChan)
}()
for {
result,ok := <-getChan
if !ok {
break
}
fmt.Printf("素数=%d\n",result)
}
fmt.Println("main 线程退出")
}