美文网首页
break in select will not break t

break in select will not break t

作者: 董泽润 | 来源:发表于2016-04-08 21:14 被阅读91次

背景

后台广告系统匹配由串行转为并行,涉及到并发数控制和一些资源回收工作,利用channel去做非常容易实现。细节是魔鬼,还是写的少:)

有问题代码示例

有问题代码

代码实现功能很简单,for 循环中接收 N 个 channel 的数据,业务 channel 传送业务数据,最后一个 ch 用来传递取消信号,如果 ch 接收到数据那么退出 for 循环。按照 C-LIKE 习惯,理想的输出肯定这样的:

start cancel

do something 

do something

do something

receive cancel 0

over

但是真实情况是:

start cancel

do something

do something

do something

receive cancel :0receive cancel :0 无数个 receive cancel :0陷入死循环 

channel 特性

先抛开问题,简单列一个 channel 的特性

1. buffered channel 和 unbuffered channel,缓冲与否的区别

2. 写入关闭的 channel 会导致panic

3. 数据未消费完的 buffered channel 关闭后,是可以读到未消费数据

4. 无数据的 channel 关闭后,可以立刻读到该类型的零值

死循环原因

上面列的 channel 特性只是为了凑数 ~~

Golang 中的 break 有两种写法,一个是 break, 一个是 break [label], 见官方文档,经过测试有如下结论:

1. 不带 label 的break,只能退出最近的 loop,并且对 select, switch 无效

2. 带 label 的 break,对 for, select , switch 均有效

3. break 的 label 只能附着在同一函数的 for, select 或 switch 语句上,对比来讲 goto 的 label就随意一些

退出的正确姿势

break

或是用 C-Like 的goto

goto

相关文章

网友评论

      本文标题:break in select will not break t

      本文链接:https://www.haomeiwen.com/subject/bxwvlttx.html