微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么这个Golang代码不能在多个时间内进行选择.

为什么这个Golang代码不能在多个时间内进行选择.

见下面的代码.永远不会发出“超时”消息.为什么?

package main

import (
    "fmt"
    "time"
)

func main() {
    count := 0
    for {
        select {
        case <-time.After(1 * time.Second):
            count++
            fmt.Printf("tick %d\n",count)
            if count >= 5 {
                fmt.Printf("ugh\n")
                return
            }
        case <-time.After(3 * time.Second):
            fmt.Printf("timeout\n")
            return
        }
    }
}

在Playground:http://play.golang.org/p/1gku-CWVAh上运行它

输出

tick 1
tick 2
tick 3
tick 4
tick 5
ugh
因为time.After是一个函数,所以在每次迭代时它返回一个新的通道.如果您希望此通道对于所有迭代都相同,则应在循环之前保存它:
timeout := time.After(3 * time.Second)
for {
    select {
    //...
    case <-timeout:
        fmt.Printf("timeout\n")
        return
    }
}

游乐场:http://play.golang.org/p/muWLgTxpNf.

原文地址:https://www.jb51.cc/go/186870.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐