博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Golang学习日志 ━━ 单向通道在函数中作为参数和返回值时的具体表现
阅读量:4116 次
发布时间:2019-05-25

本文共 1865 字,大约阅读时间需要 6 分钟。

单向通道并不难理解,<-表示方向是入还是出,主要是应用起来有点拗,下面举个例子,分别在函数的参数和返回值中放入了单项通道,看一下取值时分别是什么结果

// 单向通道:一般只在参数中限制通道方向是取值还是输入// 现在返回值第二个只写,这会导致运用这个函数的时候,能获取到channel的内存地址,但是获取不到其中存着的值func danxiangtongdao(i chan<- int, j <-chan int) (<-chan int, chan<- int) {
fmt.Println("dxtd通道内存量:", len(i)) //i只能写,不能取 //x := <-i //通道为引用类型,i和j指向的都是同一个通道 i <- 20 fmt.Println("dxtd通道存入一个20") fmt.Println("dxtd通道内存量:", len(i)) //========从通道内第一次取值 y := <-j //通道为引用类型,此次获取的值为函数外传入通道的值10 fmt.Println("函数内第一次通道取值:", y) y++ fmt.Println("dxtd通道内存量:", len(i)) //创建p通道并写入 var p = make(chan int, 1) p <- y //========从通道内第二次取值 y = <-j //由于通道是引用类型,此次获取的值为本函数内传入的20 fmt.Println("函数内第二次通道取值:", y) y-- fmt.Println("dxtd通道内存量:", len(i)) //创建q通道并写入 var q = make(chan int, 1) q <- y //========关闭通道,不是销毁,不影响获取已有的值 close(p) close(q) //========返回两个通道,状态一个可读,一个可写 return p, q}func main(){
fmt.Println("==============单向通道=============") //创建dxtd通道,允许有两个值 //因为本例中此通道传入函数后首先就做了一次写入操作,如果不是2,则会因通道存量不够而提示死锁deadlock var dxtd = make(chan int, 2) //通道存值 dxtd <- 10 fmt.Println("dxtd通道存入一个10") //由于通道是引用类型,如果此处关闭通道则函数中将不能修改本通道 //close(dxtd) //通道作为参数传给函数danxiangtongdao(),并返回两个方向不同的单向通道 dxtd1, dxtd2 := danxiangtongdao(dxtd, dxtd) //获取dxtd1通道内的值 dxtd3 := <-dxtd1 //由于dxtd2通道只写,因此取不到dxtd2内的值 //dxtd4 := <-dxtd2 //获取dxtd通道内现在的存量 dxtdnow := len(dxtd) //关闭dxtd通道 close(dxtd) fmt.Printf("原dxtd为%#v【其存量为%#v】\n函数的两个返回通道如下\n第一个:%#v【只读,存有的值为%#v】\n第二个:%#v【只写,取不到】\n", dxtd, dxtdnow, dxtd1, dxtd3, dxtd2)}// 打印内容:// ==============单向通道=============// dxtd通道存入一个10// dxtd通道内存量: 1// dxtd通道存入一个20// dxtd通道内存量: 2// 函数内第一次通道取值: 10// dxtd通道内存量: 1// 函数内第二次通道取值: 20// dxtd通道内存量: 0// 原dxtd为(chan int)(0xc00001a0e0)【其存量为0】// 函数的两个返回通道如下// 第一个:(<-chan int)(0xc00001a150)【只读,存有的值为11】// 第二个:(chan<- int)(0xc00001a1c0)【只写,取不到】

通道的特性

=== 陆续总结 ===

  1. 通道内放入值后只要取一次,其值就在通道内消失了,再取值就是下一个值了,是个动态的过程;
  2. 通道缓冲池内设定允许存放的数量,存满后再存入会出错,空值时进行取出操作也会出错;
  3. 通道内存放的内容如果比较大,则建议存放指针;

转载地址:http://ovkpi.baihongyu.com/

你可能感兴趣的文章
C语言-变量类型
查看>>
C语言-static和extern关键字1-对函数的作用
查看>>
C 语言-static和extern关键字2-对变量的作用
查看>>
【JavaScript 教程】浏览器—History 对象
查看>>
还不会正则表达式?看这篇!
查看>>
100道+ JavaScript 面试题,助你查漏补缺
查看>>
JavaScript深入理解之闭包
查看>>
这才是学习Vite2的正确姿势!
查看>>
Stack Overflow 以18 亿美元已售出!我们还可以继续免费使用它吗?它的未来会怎么?...
查看>>
Sass 循环语句,你需要学习一下
查看>>
20个JavaScript代码片段,提升你的JavaScript技能,让你更专业
查看>>
ES6中对象新增了哪些扩展?
查看>>
50个CSS最佳做法指南,以帮助你编写更好的CSS
查看>>
大厂T6,年薪40w+,碰到这样的面试题一样心虚...
查看>>
7 个适用于所有前端开发人员的很棒API,你需要了解一下
查看>>
9个CSS技巧每个专业的Web开发人员都必须知道
查看>>
8 个有用的JavaScript中的数组函数(附代码片段)
查看>>
52个JavaScript常用工具函数整理
查看>>
使用axios请求,前端数字long类型精度问题解决方法
查看>>
8个JavaScript数组操作必须熟练运用的方法
查看>>