## **一:管道的使用**
1. 创建一个可以存放3 个int 类型的管道
![](https://img.kancloud.cn/01/27/012755179b090e9836d45648bf562267_1209x335.png)
<br>
<br>
**代码解析**
```
package main
import("fmt")
func main(){
var intchan chan int // chan是关键字:【管道】,int则是管道的类型
intchan = make(chan int,3)
fmt.Println(intchan)
// 已这样方式获取打印出的则是intchan的内存地址,后期我们将如何获取值
}
```
**运行结果**
`0xc00000e028`
<br>
<br>
2. 查看intchan的内存地址,以及chan本身的内存地址
![](https://img.kancloud.cn/b1/58/b1582acbab59a2ee0f1cfdaf1cc2c96c_1209x356.png)
<br>
<br>
**运行结果**
```
intchan的内存地址是0xc0000ba000
chan本身的内存地址是0xc0000b4018
```
<br>
<br>
3. 向管道写入数据
![](https://img.kancloud.cn/b9/3e/b93ea4d2ec1e38be605cdc2fad877daf_1209x441.png)
**这里我们注意到,make的时候我们给了3个容量,下面写入是三个,如果写4个会失败吗?为什么?**
**示例:**
![](https://img.kancloud.cn/cb/46/cb466d0ac8e99aa0242cb18c07816f31_1209x441.png)
**运行结果:**
```
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
/Users/wang/go/src/awesomeProject/lianxi/main/channel_demo03write.go:10 +0xae
```
看到上面的运行结果第10行代码引发了一个`deadlock`的错误,**当我们往管道里写入数据时,不得超过管道定义时的容量**
<br>
<br>
4. 查看管道的容量和长度
![](https://img.kancloud.cn/af/2d/af2d3a13f4d9de0c6d5e897cda410bb9_1209x420.png)
<br>
<br>
5. 从管道中读取数据【关键字符<-在管道的前面】
![](https://img.kancloud.cn/e2/14/e214b1575992bf230499f128ea825ee2_1209x526.png)
**运行结果**
```
sum读取到数据为10
intchan的长度为2
intchan的容量为3
```
<br>
<br>
6. 在没有使用协程的情况下,如果我们的管道数据已经全部取出,再取就会报告 deadlock
![](https://img.kancloud.cn/b7/d5/b7d55db9b8bb489fe6bff2b9520d7d90_1209x718.png)
**运行结果**
```
intchan的内存地址是0xc00012e000
chan本身的地址是0xc000124018intchan len = 3
cap = 3res读取到的数据为10
intchan的长度为2
intchan的容量为3fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
/Users/wang/go/src/awesomeProject/lianxi/main/channel_demo05read_err.go:23 +0x462
```
如上已经报错,第23行超读引发了错误,因为定义channel时我们设置的容量是3,写是3,但是读取16行21行22行已经读取完毕,23行未读到内容引发错误
注释23行,执行一遍在看结果
![](https://img.kancloud.cn/a4/ff/a4ff3366a003b3b15d5524e6550a6e38_1209x718.png)
<br>
**运行结果**
```
intchan的内存地址是0xc00006e000
chan本身的地址是0xc00000e028intchan len = 3
cap = 3res读取到的数据为10
intchan的长度为2
intchan的容量为3res1 = 20
res2 = 30
```
- 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
- 第一节:反射基本介绍
- 第二节:反射重要的函数和概念
- 第三节:反射快速入门案例
- 第四节:反射注意事项
- 第五节:反射练习题
- 第六节:反射最佳实践