## **应用案例一:**
请完成goroutine和channel协同工作的案例,具体要求:
1)开启一个**writeData**协程,向管道**intChan**中写入50个整数.
2)开启一个**readData**协程,从管道**intChan**中读取**writeData**写入的数据。
3)注意: **writeData**和**readDate**操作的是同一个管道
4)主线程需要等待**writeData**和**readDate**协程都完成工作才能退出
<br>
<br>
![](https://img.kancloud.cn/1e/6b/1e6b381bc769c8af851fdeb701155c6a_1209x994.png)
<br>
**运行结果**
```
读取到数据为0
写入数据为0
写入数据为1
写入数据为2
写入数据为3
写入数据为4
写入数据为5
写入数据为6
写入数据为7
写入数据为8
写入数据为9
写入数据为10
写入数据为11
写入数据为12
写入数据为13
写入数据为14
写入数据为15
写入数据为16
写入数据为17
写入数据为18
写入数据为19
写入数据为20
写入数据为21
写入数据为22
写入数据为23
写入数据为24
写入数据为25
写入数据为26
写入数据为27
写入数据为28
写入数据为29
写入数据为30
写入数据为31
写入数据为32
写入数据为33
写入数据为34
写入数据为35
写入数据为36
写入数据为37
写入数据为38
写入数据为39
写入数据为40
读取到数据为1
写入数据为41
写入数据为42
读取到数据为2
读取到数据为3
读取到数据为4
读取到数据为5
读取到数据为6
读取到数据为7
读取到数据为8
读取到数据为9
读取到数据为10
读取到数据为11
读取到数据为12
读取到数据为13
读取到数据为14
读取到数据为15
读取到数据为16
读取到数据为17
读取到数据为18
读取到数据为19
读取到数据为20
读取到数据为21
读取到数据为22
读取到数据为23
读取到数据为24
读取到数据为25
读取到数据为26
读取到数据为27
读取到数据为28
读取到数据为29
读取到数据为30
读取到数据为31
读取到数据为32
读取到数据为33
读取到数据为34
读取到数据为35
读取到数据为36
读取到数据为37
读取到数据为38
读取到数据为39
读取到数据为40
读取到数据为41
读取到数据为42
读取到数据为43
写入数据为43
写入数据为44
写入数据为45
写入数据为46
写入数据为47
写入数据为48
写入数据为49
写入数据为50
读取到数据为44
读取到数据为45
读取到数据为46
读取到数据为47
读取到数据为48
读取到数据为49
读取到数据为50
```
<br>
<br>
## **应用案例二:**
阻塞
**问题:** 上面的代码如果,注销掉,go readData(intchan,exitchan),程序会怎么样??
**答:** 如果只向管道,写入数据,而没有读取,就会出现阻塞deadlock,原因是intchan
容量只有10,而writeData会写入50个数据,因此会阻塞在writeData的**intchan<-i**
<br>
<br>
### **应用案例三:**
需求:要求统计1-8000的数字中,哪些是素数?这个问题在本章开篇就提出了,现在我们有goroutine和channel的知识后,就可以完成了
分析思路:
* 传统的方法,就是使用一个循环,循环的判断各个数是不是素数[ok]。
* 使用并发 **/** 并行的方式,将统计素数的任务分配给多个(4个)goroutine去完成,完成任务时间短。
1,画出分析思路2\. 代码实现
说明:使用goroutine完成后, 可以在使用传统的方法来统计一下,看看完成这个
任务,各自耗费的时间是多少?[用map保存primeNum]
- Golang语言之旅
- 第一章:初始小节以及安装
- 一:Golang语言特性
- 二:Windows上安装Go语言开发包
- 三:在Mac OS上安装Go语言开发包
- 第二章:GO语言注意事项
- 一:Dos的常用指令
- 第三章:Go初识小菜
- 一:Go语言之变量与常量
- 二:Go内置值-引用类型
- 三:基本的数据类型
- 四:字符串(char)
- 五:布尔类型(bool)
- 六:字符串类型(string)
- 七:基本数据类型的默认值
- 八:基本数据类型的互相转换
- 九:基本数据类型和string类型的相互转换
- 十:Golang指针
- 十一:值类型和引用类型
- 十二:标识符和命名规范
- 十三:系统保留关键字and预定义标识符
- 十四:fmt常用方法解析
- 第四章:Go运算符
- 一:运算符的基本介绍
- 二:算术运算符
- 2.1:算数运算符细节
- 三:关系运算符
- 3.1:关系运算符细节
- 四:逻辑运算符
- 4.1:逻辑运算符细节及案例
- 五:Go赋值运算符
- 5.1:案例演示赋值运算符的基本使用
- 5.2:赋值运算符的特点
- 六:Go位运算符
- 七:其他运算符
- 八:运算符的优先级
- 九:控制台输入语句
- 十:进制
- 十一:位运算
- 第五章:流程控制大纲
- 一:if语句
- 二:switch语句
- 三:for循环
- 第六章:函数-包-错误处理
- 一:Go函数
- 二:Go包
- 三:匿名函数
- 四:闭包
- 五:函数defer
- 六:函数参数的传递方式
- 七:变量的作用域
- 八:时间和日期相关函数
- 九:new和recover异常
- 十:数组(Array)切片(Section)
- 十一:切片(slice)
- 十二:3 数组的排序和查找
- 第七章:Map
- 第一节:Map基础认识
- 第二节:Map初始化和make
- 第三节:Map增删改查
- 第四节:Map的切片
- 第五节:Map的注意事项
- 第八章:面向对象(上)
- 第一节:结构体(值类型)
- 第二节:方法
- 第三节:面向对象编程应用实例
- 第九章:面向对象(下)
- 第一节:面向对象之抽象
- 第二节:面向对象之继承
- 第三节:面向对象之多态
- 第四节:接口
- 第十章:文件操作
- 第一节:文件基本介绍
- 第二季:写文件实例操作
- 第三节:JSON
- 第十一章:单元测试
- 第一节:单元测试介绍
- 第二节:单元测试案例
- 第三节:单元测试总结
- 第四节:单元测试案例
- 第十二章:goroutine和channel
- 第一节:goroutine基本介绍
- 第二节:goroutine入门案例
- 第三节:goroutione调度模型
- 第四节:Golang设置运行的CPU数量
- 第十二章:channel
- 第一节:channel基本介绍
- 第二节:channel基本使用
- 第三节:channel案例演示
- 第四节:channel 使用的注意事项
- 第五节:channel练习题
- 第六节:channel的遍历和关闭
- 第七节:goroutione和channel结合
- 第八节:channel细节处理
- 第十二章:并发模式
- 第十三章:反射reflect
- 第一节:反射基本介绍
- 第二节:反射重要的函数和概念
- 第三节:反射快速入门案例
- 第四节:反射注意事项
- 第五节:反射练习题
- 第六节:反射最佳实践