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

1 1
OK兄
OK兄 2022-09-03 16:07

看以下代码执行:

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这行之后的代码,为啥每次运行的结果可能会不一样。

回帖
  • OK兄 (楼主) 1楼
    2022-09-03 16:27

    原文地址: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了


    0 回复
本周热议
赞助渠道1

赞助渠道2