作者回复: 你的问题是什么?
作者回复: 这里只会检查一下接收操作或发送操作是否可以进行(是否不会被阻塞)。有兴趣的话可以看一下 runtime/select.go 中的 selectgo 函数的源码。
作者回复: 因为 make(chan int) 初始化的是不带缓冲的通道。非缓冲通道只有在收发双方都就绪的情况下才能传递元素值,否则就阻塞。
作者回复: 是的。
作者回复: 放在for循环里每次也是随机的,不过可以用for循环,或者再次执行select语句。
作者回复: 首先修正一点,这与进程无关,与 goroutine 有关,而且没有父子关系。
正题回答:不能。因为程序流程已经走到 downloadBigBigFile() 这里了,不可能在没有循环或跳转的情况下再往回走。
看起来你应该把 ctx 放入 downloadBigBigFile 函数,然后在这个函数里做判断。
作者回复: 你可以看看我在前面的(程序实体相关的)文章中讲的。程序实体的名称如果首字母大写那么就说明是其访问权限是公开的,否则就是包级私有的。
作者回复: 设置为nil就可以了。
作者回复: 在这里不会,因为getIntChan函数已经把intChan2关闭了。
文章里的描述我改进了一下:
2. 通常,当通道 intChan2 中没有元素值时,这条 for 语句会被阻塞在有 for 关键字的那一行,直到有新的元素值可取。不过,由于这里的 getIntChan 函数会事先将 intChan2 关闭,所以它在取出 intChan2 中的所有元素值之后会直接结束执行。
后面我会让编辑帮我更新一下。
作者回复: 不好意思,问问题的人太多了,你问的时候最好带上比较完整的上下文。我下面按我目前对你问题的理解回答你吧。
select 语句对某个 case 中的通道接收表达式的实际执行需要两个前提条件:
1. 接收操作不会被阻塞。
2. 当前 case 被选中。
对于 case 中的通道发送表达式来说也是类似。因此,我们完全不用担心那些未被选中的通道操作会突然执行。
作者回复: 这属于语言特性之一,没有什么特殊原因。你可以理解为避免case书写顺序影响到执行顺序。
作者回复: 这种情况下是这样。
作者回复: 设计API的时候很有用。