Golang-素数案例应用

 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 线程退出")

}

 

Guess you like

Origin blog.csdn.net/qq_35361859/article/details/103558618