作者回复: 如果结果在超时后才返回,就没有携程从channel中获取数据,这是如果不采用buffer channel,数据产生者携程就会一直阻塞,导致携程泄漏。 我的例子中给的等待是500ms,而超时时100ms,你可以把等待改成50ms,就不会超时了。
作者回复: 这个并不是从上到下顺序执行的,当所有的case处于阻塞状态,就会走default分支
作者回复: 如果有多个 case 都可以运行,Select 会随机公平地选出一个执行。其他不会执行。 否则: 如果有 default 子句,则执行该语句。 如果没有 default 子句,select 将阻塞,直到某个通信可以运行;Go 不会重新对 channel 或值进行求值。
作者回复: 1. 发送完毕可以通过close来通知接收者。 2. channel不关闭不会有问题,它不是核心句柄(如:文件,socket) 3. channel的确用来解偶生产者和消费者。
作者回复: 有的。例如,并行执行多个查询,只要其中一个返回即可。
作者回复: 常见的用途还包括,多个并行任务的返回等待。可以参见后面的典型并发任务的章节