首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一个select-case内从一个通道读取并写入另一个通道

在一个select-case内从一个通道读取并写入另一个通道
EN

Stack Overflow用户
提问于 2021-07-01 23:05:56
回答 1查看 77关注 0票数 0

考虑下面的Go代码,它将立即调用worker.DoWork(),然后每分钟调用一次:

代码语言:javascript
复制
triggerChan := make(chan time.Time, 1)
triggerChan <- time.Now() // We don't want to wait a minute for the first call of worker.DoWork() to happen.
ticker := time.NewTicker(time.Minute)
defer ticker.Stop()
for {
    select {
    case triggerChan <- <-ticker.C:
    case <-triggerChan:
        worker.DoWork()
    }
}

在第一个select之前向triggerChan写入一个值,以将其定向到case <-triggerChan中,以便立即调用worker.DoWork()。然而,如果ticker.C已经有了一个可用的值(如果我们使用像time.Microsecond这样的东西而不是time.Minute),会发生什么呢?运行时是否会看到triggerChan <- <-ticker.C将阻塞,或者它是否会愉快地软锁,而不知道<-ticker.C的结果正在尝试做什么?它知道这种“从频道进入频道”的-situation吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-01 23:12:31

select根据triggerChan的状态做出决定,但是它首先计算发送操作的右侧表达式。因此,在进入时,它将等待<-ticker.C返回。然后它将从通道中读取第一个值,然后写入...

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68212654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档