1.开启4个协程完成求1..n之间有多少个素数
package main import ( "fmt" ) //第一个协程存储数据到管道里面 func putNum(putchan chan int){ for i:=1;i<1000;i++ { putchan <- i; } close(putchan);//关闭管道 } //读出是素数管道 func primNum(puuchan chan int,primchan chan int,exitchan chan bool){ var flag bool; for { num,ok:=<-puuchan;//读出数据 if !ok { break; } flag=true; for i:=2; i<num;i++ { if num % i == 0 { flag = false; break; } } if flag { primchan <- num; } } exitchan <- true; } func main(){ puchan:=make(chan int,2000);//需要找的数字 primchan :=make(chan int ,2000);//存储是素数的数字 exithcan:=make(chan bool,4);//设计退出的管道 go putNum(puchan);//写入数据 for i:=0;i<4;i++{//等待处理结果4个协程 go primNum(puchan,primchan,exithcan);//开启4个协程 } go func(){ for i:=0;i<4;i++{ <-exithcan; } close(primchan);//关闭素数管道 }() for { res,ok := <- primchan; if !ok { break; } fmt.Printf("素数=%d ",res); } fmt.Println("main线程退出"); }
2.使用管道变成读管道和写管道案例
package main import ( "fmt" "time" ) //管道声明只读和只写 //var mychan chan <- int;//声明了一个只写管道 //var mychan2 <- chan int;//声明了只读管道 //案例演示 //想管道里面写入数据 func send(mychan chan <- int){ for i:=0;i<200;i++ { mychan <- i; time.Sleep(time.Second * 2); fmt.Printf("send data is %v ",i); } close(mychan); } //接收数据 func recv(revchan <- chan int,exitchan chan bool){ for { res,ok := <-revchan; if !ok { break; } fmt.Printf("data is[%v] ",res); time.Sleep(time.Second*2); } exitchan <- true; } func main(){ ch:=make(chan int,10);//声明了一个管道 exitch:=make(chan bool,3);//退出管道 go send(ch); go recv(ch,exitch); for { flag:= <-exitch; if !flag { break; } } }