杰克工作室 发表于 2023-3-1 11:11

go通道channel写入channel后的语句没有执行?

看以下代码执行:
<pre>
package&nbsp;main
&nbsp;
import&nbsp;(
&nbsp;&nbsp;&nbsp;&nbsp;&quot;fmt&quot;
)
&nbsp;
func&nbsp;Count(ch&nbsp;chan&nbsp;int)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(&quot;before&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;ch&nbsp;&lt;-&nbsp;1
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(&quot;after&quot;)
}
&nbsp;
func&nbsp;main()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;:=&nbsp;make([]chan&nbsp;int,&nbsp;10)
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;10;&nbsp;i++&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;make(chan&nbsp;int)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;go&nbsp;Count(s)
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;_,&nbsp;ch&nbsp;:=&nbsp;range&nbsp;s&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;-ch
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre>
主要问题是 ch &lt;- 1这行之后的代码,为啥每次运行的结果可能会不一样。

杰克工作室 发表于 2023-3-1 11:11

原文地址:https://golangtc.com/t/570a2c51b09ecc66b90002c6

摘取部分回答:

这段程序能保证 before 打印完,不保证 after 打印完,然而 after 只打印一次似乎有点奇怪,果然在我的机器上是打印 after 9次,在 play.golang.org 上也是9次,不知道LZ什么环境?

-----------------------------------------------------------------------------------

不用纠结9次和10次。 main 函数最后加个 sleep 就可以看到预期情况了。

---------------------------------------


make(chan int) 默认是阻塞的:
写入时,会阻塞住,直到有人读走。
主线程 for循环读完后,10个子线程没有来得及切换过去,程序就退出了。

你可以构造缓冲式的chan:make是加上第二个参数
make(chan int, 1)
这样你的代码,就能打印出10个after了
页: [1]
查看完整版本: go通道channel写入channel后的语句没有执行?