1.1~8000查找素數的例子
package main
import "fmt"
// 向intChan放入1-8000個數
func putNum(intChan chan int){
for i:=1;i<=80000;i++{
intChan<-i
}
// 關閉intChan
close(intChan)
}
// 從 intChan 取出數據,並且判斷是否爲素數,如果是,就放入到primeChan
func primeNum(intChan chan int,primeChan chan int,exitChan chan bool){
// 使用for 循環
var flag bool // 是否爲素數
for{
num,ok :=<-intChan
if !ok{
break // 表示管道已關閉
}
flag=true
for i:=2;i<num;i++{
if num %i==0{ // 說明不是素數
flag=false
break
}
}
if flag{
primeChan<-num
}
}
fmt.Println("當前協程運行結束")
exitChan<-true // 向管道內標誌協程運行結速
}
func main(){
// 數據管道
intChan :=make(chan int,1000)
// 將素數放入該管道
primeChan :=make(chan int,2000)
// 每個協程運行結束向該管道內寫入一個bool值
exitChan :=make(chan bool,4)
go putNum(intChan)
for i:=0;i<4;i++{
// 使用協程找素數
go primeNum(intChan,primeChan,exitChan)
}
go func() {
for i:=0;i<4;i++{
<-exitChan
}
// 當exitChan 取出了4個協程結束標誌時,可以關閉primeChan管道
// 表示所有數據查完成,相關協程已運行結束
close(primeChan)
// 運行結束管道此時也可以關閉,他的任務已結完成
close(exitChan)
}()
// 主線程遍歷我們的查找的素數結果
for{
res,ok :=<-primeChan
if !ok{
break
}
fmt.Println("素數:",res)
}
fmt.Println("程序運行結束~")
}
2. 個人使用引用類型變量來處理了一個程序結束問題
package main
import (
"fmt"
)
func whriteChanOne(dataChan chan int,voerCode *int){
for i:=1;i<10000;i++{
dataChan<- i
fmt.Println("協程1寫入",i)
}
*voerCode++
}
func whriteChanTwo(dataChan chan int,voerCode *int){
for i:=10000;i<20000;i++{
dataChan<- i
fmt.Println("協程2寫入",i)
}
*voerCode++
}
func whriteChanThree(dataChan chan int,voerCode *int){
for i:=20000;i<30000;i++{
dataChan<- i
fmt.Println("協程3寫入",i)
}
*voerCode++
}
func readChanData(dataChan chan int,readChan chan bool,voerCode *int){
isClose :=false
for {
if *voerCode ==3&&!isClose{
close(dataChan)
isClose=true
}
v,ok :=<-dataChan
if !ok{
readChan<- true
close(readChan)
break
}
fmt.Println("協程讀取",v)
}
}
func main() {
dataChan :=make(chan int,30000)
readChan :=make(chan bool,1)
voerCode :=0
go whriteChanOne(dataChan,&voerCode)
go whriteChanTwo(dataChan,&voerCode)
go whriteChanThree(dataChan,&voerCode)
go readChanData(dataChan,readChan,&voerCode)
for {
_,ok := <-readChan
if !ok{
break
}
}
fmt.Println("協程讀取結束")
}