初学者关于无缓冲channel的疑问

func main() {
    ch := make(chan int)

    go func() {
        for {
            fmt.Println(<-ch)
            time.Sleep(time.Second)
        }
    }()

    ch <- 0
    ch <- 1
    fmt.Println("finished")
}

运行结果

0
finished

在数据没有被接收以前,send操作不是会被阻塞吗?为什么这里会跳过1直接finished?

最佳答案

因为时间太短没来得及输出就退出了,可以在打印finished前面加多点sleep时间

9个月前 评论
讨论数量: 5

因为你创建了一个goroutine来接收数据,主函数还是异步执行的

9个月前 评论

因为时间太短没来得及输出就退出了,可以在打印finished前面加多点sleep时间

9个月前 评论

因为子协程还没有来得及执行 fmt.Println 主协程就已经执行完毕并退出了

在 ch <- 1 下方也睡一会儿,就可以得到你预期的结果。

9个月前 评论
ricktian 9个月前

我运行测试了,全部都打印了没有你这种问题,请检查自己的运行环境

9个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!