请完成routine和channel协同工作的案例,具体要求
1. 开启一个writeData协程,向管道intChan中写入50个整数
2. 开启一个readData协程,从管道intChan中读取writeData写入的数据
3. 注意:writeData和readData操作的是同一个管道
4. 主线程需要等待writeData和readData协程都完成工作才能退出
![](https://img.kancloud.cn/2c/f5/2cf5a23a1624f251efff796628a4c800_1240x524.png)
```
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