博客
关于我
golang channel的行为
阅读量:426 次
发布时间:2019-03-06

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

 

1. 读nil的channel是永远阻塞的。关闭nil的channel会造成panic。

2. closed channel的行为:

  (1)向close的channel发消息会panic,关闭一个已经关闭的channel,也会panic。所以应该由生产者关闭channel。

  (2)如果close的channel还有数据,仍然可以读取。

  (3)读取close的并且空的channel,会马上返回零值(注意chan int会返回0),所以可以用于广播。

  (4)val,ok = <- ch, ok=false表示channel空并且close了 (注意不是“或者”)。结合(1)、(2),这里可以用于消费者。

  (5)close channel可以用来广播,因为读取或者select关闭的channel,会马上返回。如果是存在多个生产者,此时不能随便关闭channel,可以通过关闭另一个channel来停止消费行为。

3. 可以对channel使用range。这样不用写select,显得代码简洁。

 

4. select是随机的,select越多channel消耗越多。

 

参考:

https://stackoverflow.com/questions/34897843/why-does-go-panic-on-writing-to-a-closed-channel

 

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

你可能感兴趣的文章
webpack loader配置全流程详解
查看>>
mysql主从复制,读写分离,半同步复制实现
查看>>
MySQL主从失败 错误Got fatal error 1236解决方法
查看>>
MySQL主从架构与读写分离实战
查看>>
MySQL主从篇:死磕主从复制中数据同步原理与优化
查看>>
mysql主从配置
查看>>
MySQL之2003-Can‘t connect to MySQL server on ‘localhost‘(10038)的解决办法
查看>>
MySQL之CRUD
查看>>
MySQL之DML
查看>>
Mysql之IN 和 Exists 用法
查看>>
MYSQL之REPLACE INTO和INSERT … ON DUPLICATE KEY UPDATE用法
查看>>
MySQL之SQL语句优化步骤
查看>>
MYSQL之union和order by分析([Err] 1221 - Incorrect usage of UNION and ORDER BY)
查看>>
Mysql之主从复制
查看>>