go通道channel写入channel后的语句没有执行?
看以下代码执行:<pre>
package main
import (
"fmt"
)
func Count(ch chan int) {
fmt.Println("before")
ch <- 1
fmt.Println("after")
}
func main() {
s := make([]chan int, 10)
for i := 0; i < 10; i++ {
s = make(chan int)
go Count(s)
}
for _, ch := range s {
<-ch
}
}</pre>
主要问题是 ch <- 1这行之后的代码,为啥每次运行的结果可能会不一样。 原文地址: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]