为了账号安全,请及时绑定邮箱和手机立即绑定

仅在满足某些条件的情况下,如何在`select`语句中执行`case`

仅在满足某些条件的情况下,如何在`select`语句中执行`case`

Go
万千封印 2022-10-17 10:05:11
我有一个频道:aChan := make(chan struct{})和超时时间var t time.Duration。如果通道关闭,或者t达到超时,我希望程序退出, 如果 t 是正的 duration。我知道我可以使用外部 if else 循环,但这看起来非常多余:    if t >= time.Duration(0) {        select {        case <-time.After(t):            fmt.Fprintln(os.Stdout, "timeout!"))            close(timeoutChan)        case <-aChan:            fmt.Fprintln(os.Stdout, "aChan is closed"))            return        }    } else {        select {        case <-aChan:            fmt.Fprintln(os.Stdout, "aChan is closed"))            return        }    }有没有更优雅的方式来写这个?
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

nil当持续时间小于零时,使用通道进行超时。通道的超时情况nil不会执行,因为nil通道上的接收永远不会准备好。


var after <-chan time.Time

if t >= 0 {

    after = time.After(t)

}

select {

case <-after:

    fmt.Println("timeout!")

    close(timeoutChan)

case <-aChan:

    fmt.Println("aChan is closed")

    return

}


查看完整回答
反对 回复 2022-10-17
  • 1 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信