找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 362|回复: 1

[疑问] go通道channel写入channel后的语句没有执行?

  [复制链接]
发表于 2023-3-1 11:11 | 显示全部楼层 |阅读模式
看以下代码执行:
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[i] = make(chan int)
        go Count(s[i])
    }
 
    for _, ch := range s {
        <-ch
    }
}
主要问题是 ch <- 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了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|学习笔记

GMT+8, 2024-9-8 09:27 , Processed in 0.023633 second(s), 14 queries , APCu On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表