package main
import (
“fmt”
“time”
)
/*
應用實例1
請完成goroutine和channel協同工作的案例,具體要求:
1)開啓一個writeData協程,向管道intChan中寫入50個整數。
2)開啓一個readData協程,從管道intChan中讀取writeData寫入的數據。
3)注意:writeData和readData操作的時同一個管道
4)主線程需要等待writeData和readData協程都完成工作才能退出
思路分析:
看代碼演示:
*/
//write Data,寫一個協程
func writeData(intChan chan int){
for i:=1;i<=50;i++{
//放入數據
intChan<-i
fmt.Println(“writeData”,i)
//time.Sleep(time.Second)
}
close(intChan)//循環寫入,寫入50個數據後,自動關閉
}
//寫另外一個協程read data
func readData(intChan chan int,exitChan chan bool){
//關閉後開始循環讀取,
for{
v,ok:=<-intChan
if !ok{
break
}
time.Sleep(time.Second)
fmt.Printf(“readData 讀到數據=%v\n”,v)
}
//readData讀取完數據後,即任務完成
exitChan<-true
close(exitChan)
}
func main(){
//創建兩個管道
intChan:= make(chan int,10)//10-50的話數據一下就就放入了
exitChan:=make(chan bool,1)
go writeData(intChan)
go readData(intChan,exitChan)
/*
如果註銷掉go readData(intChan,exitChan),程序會怎麼樣?
答:如果只是向管道寫入數據,而沒有讀取,就會出現阻塞而dead lock,原因是intChan容量是10,而代碼writeData會寫入50個數據,因此會阻塞再writeData的ch<-i
*/
time.Sleep(time.Second*10)
for{
_,ok:=<-exitChan
if!ok{
break
}
}
}