go看起来有点奇怪的特性:向nil channel读写数据会永久堵塞该goroutine,正确使用该特性!!

附上两篇链接:

下面这篇文章讲述了该特性的奇怪之处,以及简单用法

https://studygolang.com/articles/3710

下面这篇文章附以了更为常见的例子:

https://blog.csdn.net/weixin_33834679/article/details/86026664

 

总结:

nil的channel不是初始化完成后故意做成是nil,相反初始化完成(往往是生产者端初始化构造channel) 后,这个channel总是可用的

这个特性往往用在for select 多路复用里面,用于: 一开始生产者产生了有数据, 消费者拿到之后可以进行某select分支A进行处理,一段时间后,其他分支想主动断掉A分支,就将该分支的channel 置为nil,从而断掉该分支。

进一步的考虑是如何回收废掉的分支这部分资源占用,事实上,因为这部分代码是当前goroutine(执行for select)的不会执行该分支而已,因此不会为该分支分配资源(如内存,cpu等)。不正确的使用,如单纯的从nil channel读取数据就会阻塞住该goroutine,且该goroutine无法被回收(为什么?),从而造成资源泄露,如下图:

func main(){
   var ch chan int
   data:=<-ch
   //or:
   for v:=range ch{
      //some code in here
   }
}

这样的代码会使当前goroutine 永久阻塞 这是不正确的做法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值