ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## **一:管道的使用** 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 ```