close函数是用于关闭通道的
官方解释(摘自close函数源代码注释):

The close built-in function closes a channel, which must be either
bidirectional or send-only. It should be executed only by the sender,
never the receiver, and has the effect of shutting down the channel
after the last sent value is received. After the last value has been
received from a closed channel c, any receive from c will succeed
without blocking, returning the zero value for the channel element.
The form x, ok := <-c will also set ok to false for a closed channel.

翻译过来就是:

close函数是一个内建函数, 用来关闭channel,这个channel要么是双向的, 要么是只写的(chan<- Type)。
这个方法应该只由发送者调用, 而不是接收者。 当最后一个发送的值都被接收者从关闭的channel(下简称为c)中接收时,
接下来所有接收的值都会非阻塞直接成功,返回channel元素的零值。
如下的代码: 如果c已经关闭(c中所有值都被接收), x, ok := <- c, 读取ok将会得到false。

验证如下:

package mainimport "fmt"func main() {ch := make(chan int, 5)for i := 0; i < 5; i++ {ch <- i}close(ch) // 关闭chfor i := 0; i < 10; i++ {e, ok := <-chfmt.Printf("%v, %v\n", e, ok)if !ok {break}}
}

输出:
0, true
1, true
2, true
3, true
4, true
0, false

在close之后, 还可以读取, 不过在读取完之后, 再检测ok, 就是false了。

如果不进行关闭就会导致阻塞进而抛出死锁,如下:

package mainimport "fmt"func main() {ch := make(chan int, 5)for i := 0; i < 5; i++ {ch <- i}// close(ch) // 关闭chfor i := 0; i < 10; i++ {e, ok := <-chfmt.Printf("%v, %v\n", e, ok)if !ok {break}}
}

结果如下:

0, true
1, true
2, true
3, true
4, true
fatal error: all goroutines are asleep - deadlock!goroutine 1 [chan receive]:
main.main()main.go:14 +0xa6
exit status 2
  • 注意事项:
    对于值为nil的channel或者对同一个channel重复close, 都会panic, 关闭只读channel会报编译错误。

代码示例如下:

关闭值为nil的通道

var c4 chan int// 运行时错误:panic: close of nil channel
close(c4)

重复关闭同一个通道

c3 := make(chan int, 1)
close(c3)// 运行时错误:
// panic: close of closed channel
close(c3)

关闭只读通道

c3 := make(<-chan int, 1)// 编译错误:
// invalid operation: close(c3) (cannot close receive-only channel)
close(c3)

正确的用法

c1 := make(chan int, 1) // 双向通道 (bidirectional)
c2 := make(chan<- int, 1) // 只写的 (send-only)
close(c1)
close(c2)

go的close函数理解相关推荐

  1. nodejs回调函数理解

    回调实例 问题:想要得到一秒后 计算出的结果 //错误写法function add(x,y) {console.log(1);setTimeout(function () {console.log(2 ...

  2. ML之MIC:利用有无噪音的正余弦函数理解相关性指标的不同(多图绘制Pearson系数、最大信息系数MIC)

    ML之MIC:利用有无噪音的正余弦函数理解相关性指标的不同(多图绘制Pearson系数.最大信息系数MIC) 目录 利用有无噪音的正余弦函数理解相关性指标的不同(多图绘制Pearson系数.最大信息系 ...

  3. 高频交易配对交易学习——Copulas函数理解

    Copulas函数理解 https://github.com/MalteKurz/VineCopulaCPP

  4. Pytorch中tensor.view().permute().contiguous()函数理解

    Pytorch中tensor.view().permute().contiguous()函数理解 yolov3中有一行这样的代码,在此记录一下三个函数的含义 # 例子中batch_size为整型,le ...

  5. pytorch中repeat()函数理解

    pytorch中repeat()函数理解 最近在学习过程中遇到了repeat()函数的使用,这里记录一下自己对这个函数的理解. 情况1:repeat参数个数与tensor维数一致时 a = torch ...

  6. SQLServer STUFF 函数理解

    SQLServer  CAST -- 转换数据类型 逗号表示分割 .     STUFF 函数理解 -- 第一个就是字符串 FOR XML PATH('') 必须用 , 第二个参数 负数或0空字符串, ...

  7. Java回调函数理解和应用

    #Java回调函数理解和应用 所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的. 在未理解之前,我也是一脸懵逼,等我理 ...

  8. pytorch 中 contiguous() 函数理解

    pytorch 中 contiguous() 函数理解 文章目录 pytorch 中 contiguous() 函数理解 引言 使用 contiguous() 后记 文章抄自 Pytorch中cont ...

  9. Android回调函数理解

    Android回调函数理解,比如我用一个activity去做显示下载进度的一个进度条,但是下载是另外一个B类来做的,这个时候我Activity获取下载的进度就可以提供一个回调接口,然后让下载类来回调就 ...

  10. softmax函数理解

    该节课中提到了一种叫作softmax的函数,因为之前对这个概念不了解,所以本篇就这个函数进行整理,如下: 维基给出的解释:softmax函数,也称指数归一化函数,它是一种logistic函数的归一化形 ...

最新文章

  1. HTML 事件属性_03
  2. python常用的日期时间模块
  3. Faster R-CNN改进篇(二): RFCN ● RON
  4. MonkeyRunner——如何在实体机上启动一个程序
  5. Luogu2114 [NOI2014]起床困难综合症 【位运算】
  6. 数据规则列表加导入导出
  7. Linux:编译生成内核模块(来自国嵌的视频教学)
  8. vue服务端渲染添加缓存
  9. 30本数据分析的书籍送给你!
  10. Anycubic Vyper 3D打印机串口屏改造开源项目之串口屏项目启动篇(一)
  11. 菜鸟心得1 - 在数据清洗过程中使用excel对重复数据进行处理
  12. win7笔记本电脑做wifi热点
  13. 百度快照不更新与投诉处理的经验
  14. 数字图像处理基础——图像空间操作的3种形式
  15. 为何大数据在国内“雷声大雨点小”
  16. 重置计算机网络配置后上不了网,win10系统网络重置后不能连接网络如何解决
  17. Firefox os
  18. LoRaWAN介绍13 SX1301
  19. vscode安装python插件失败_vscode安装python插件
  20. 最新!中国内地大学ESI排名出炉:362所高校上榜!

热门文章

  1. 深度学习教程(15) | 自然语言处理与词嵌入(吴恩达·完整版)
  2. MATLAB超定方程解法
  3. voip linksys
  4. 嗅探器c语言源码,C语言嗅探器
  5. Android学习系列(33)--App应用之提交到各大市场渠道
  6. 小程序源码:图片秒加水印制作生成-多玩法安装简单
  7. 从新一期技术雷达看技术领域最新趋势
  8. python 股票分析_Python 股票分析入门
  9. 上升沿判断语句_股票上升趋势中回调买入技巧,强势股顺势横盘突破买入法
  10. 【知识图谱】实践篇——基于知识图谱的《红楼梦》人物关系可视化及问答系统实践:part3前端搭建与可视化