1.开启4个协程完成求1..n之间有多少个素数 package main import ( "fmt" ) //第一个协程存储数据到管道里面 func putNum(putchan chan int){ for i:=1;i1000;i++ { putchan - i; } close(putchan);//关闭管道 } //读出是素
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\n",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\n",i);
}
close(mychan);
}
//接收数据
func recv(revchan <- chan int,exitchan chan bool){
for {
res,ok := <-revchan;
if !ok {
break;
}
fmt.Printf("data is[%v]\n",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;
}
}
}
【感谢龙石为本站提供api网关 http://www.longshidata.com/pages/apigateway.html】