time - 为什么这个 Golang 代码不能在多个时间之间进行选择。 channel 工作后?

标签 time go timeout channel

为什么这个 Golang 代码不能在多个时间之间进行选择。 channel 工作后?

请参阅下面的代码。永远不会发出“超时”消息。为什么?

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 是一个函数,所以在每次迭代中它都会返回一个新的 channel 。如果你希望这个 channel 对于所有迭代都是相同的,你应该在循环之前保存它:

timeout := time.After(3 * time.Second)
for {
    select {
    //...
    case <-timeout:
        fmt.Printf("timeout\n")
        return
    }
}

Playground :http://play.golang.org/p/muWLgTxpNf .

关于time - 为什么这个 Golang 代码不能在多个时间之间进行选择。 channel 工作后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35036653/

相关文章:

ios - 确定两次触摸之间的确切时间

android - 在android中的特定时间后停止后台服务

go - beego 找不到带有 bee run 的布局 tpl 文件

javascript - TypeScript setTimeout 循环传递此错误

java - 我需要用户提供一个时间,当这个时间到达时,将触发通知,我该怎么做?

python - Tornado Web 框架 Mysql 连接处理

git - 是否可以使用 "go get"获取 git 标签?

reflection - 为什么可以使用反射在 slice 中设置值?

connection - SignalR 客户端由于不活动而停止连接

sockets - 我可以使用 Boost.Asio 在多线程 I/O 服务超时的情况下同步读取套接字吗?