关于go中的协程,有一个小小的问题

Pikachu · · 1032 次点击
4楼 <a href="/user/Pikachu" title="@Pikachu">@Pikachu</a> 对于你的原帖的源代码,在第一次循环之后,最初 ch 就已经没有用了,但因为 `generate()` 还在用它所以并不会被 gc 回收,但是因为 ch 是 unbuffered 的,实际上 `generate()` 只会把 2 送进 ch,送 3 的时候就会被阻塞。每个循环后的 ch 多没关系了,因为你每次循环都创建了一个新的 ch。 对于你在4楼贴的代码,`filter()` 是能够源源不断拿到 `generate()` 产生的数的,因为你传入 `filter()` 的 ch 还是旧的ch,之后的 ch 就跟 ch1 一样,是传入 `filter()` 的 out。
#6
更多评论
不太明白你的想法,你这里声明的 ch 是 unbuffered 的,所以 ch 并不会像你注释的那样同一个时刻有多个数。而且当执行到 ch = ch1 的时候,这里的 ch 已经跟前面 `go generate(ch)` 的 ch 不是一个 ch 了。
#1
我其实想知道,每次循环后ch通道是个什么状态(其中的值是怎么改变的)。 你是说每次循环都会用值覆盖掉之前的ch通道吗?`go generate(ch)` 方法中是一个无限循环往通道赋值的一个函数。所以是第一次循环执行完毕之后 `generate()` 这个方法就已经被结束掉了吗? 其实我一直感觉协程应该是没有什么执行顺序的,但是我看到的感觉还是顺序执行的呢?
#2