請完成routine和channel協同工作的案例,具體要求
1. 開啟一個writeData協程,向管道intChan中寫入50個整數
2. 開啟一個readData協程,從管道intChan中讀取writeData寫入的數據
3. 注意:writeData和readData操作的是同一個管道
4. 主線程需要等待writeData和readData協程都完成工作才能退出

```
package main
import (
"fmt"
)
func writeData(intChan chan int) {
for i := 0; i < 10000; i++ {
? ? ? ? intChan <- i
? ? ? ? fmt.Printf("writeData value=%v\n", i)
//time.Sleep(time.Second)//太快如果看不到效果,可以加sleep
}
close(intChan)
}
func readData(intChan chan int, exitChan chan bool) {
for {
v, ok := <-intChan
if !ok {
break
? ? ? ? }
? ? ? ? fmt.Printf("readData value=%v\n", v)
}
exitChan <- true
close(exitChan)
}
func main() {
intChan := make(chan int, 10000)//即使容量比較小,只要檢測到有讀取的協程,就不會出現死鎖
exitChan := make(chan bool, 1)
go writeData(intChan)
go readData(intChan, exitChan)//如果沒有readData并且intchan容量不足時,會出現阻塞
for {
_, ok := <-exitChan
if !ok {
break
? ? ? ? }
? ? }
}
```
- 數據類型
- 數組array
- 切片slice
- 字符串string
- map
- 結構體struct
- 方法func
- 匿名結構體(繼承)
- 字段別名
- 接口interface
- 常量
- 基礎語法
- 循環for
- 遍歷
- 函數func
- defer
- 異常處理error
- 訪問范圍
- 包
- 類型斷言
- 文件
- 打開文件
- 讀取文件
- 寫文件
- 判斷是否存在
- 拷貝文件
- JSON
- 序列化
- 反序列化
- 命令行
- 雜項
- Windows下配置加速
- 相關鏈接
- 占位符
- 隨機數rand
- 單元測試
- goroutine
- 并發和并行
- 協程和主線程
- MPG模式
- 設置CPU數量
- 全局互斥鎖
- 管道
- 示例1
- 示例2
- select
- 異常捕獲
- 反射
- 示例
- 示例-改變值
- 網絡編程
- TCP編程
- 示例一
- redis