go - 来自不同 channel 的数据进入 select 语句可以被忽略吗?

标签 go channel

如果没有在 select 语句中的正确时刻捕获通过 golang 中的 channel 传入的数据,是否有可能被忽略?

例如,假设有这个选择语句:

for {
    select {
    case <-timer.C:
        //block A
    default:
        // block B takes 2 seconds.
    }
}

如果计时器在 block B 运行时结束, block A 是否仍在循环的下一次迭代中运行,或者 channel 的传入数据是否丢失?

最佳答案

当定时器超时时,它会发送C上的当前时间。如果此时没有人正在从C读取,发送会阻塞,所以它会一直等到值被接收。在这种情况下,它将等到循环的下一次迭代。

channel 被设计成一种同步机制,因此它们不需要读者和作者已经同步。

关于go - 来自不同 channel 的数据进入 select 语句可以被忽略吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30108562/

相关文章:

string - 如何创建任意长度的字符串

go - 在中间件中修改请求头

go - 无法在golang中使用公钥加密

go - 将golang Web应用程序推送到heroku时,buildpack未知请求的文件(go1.13.7.linux-amd64.tar.gz)?

go - map channel 的设计模式?

objective-c - 如何使用 objective-c 实现 go 样式 channel (CSP)?

go - 使用 golang 提取 TCP 负载中的自定义数据格式

ios - 解析 iOS API - 添加 channel

go - 在 go http 处理程序中使用 goroutine 和 channel 使 ResponseWriter 被阻塞

go - 我怎么知道关闭是必要的?