go - 定时器在 Golang 中是如何工作的

标签 go time timer

<分区>

我正在尝试理解 Go 中的 channel 。有一个简单的代码

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    wg.Add(1)

    go func() {
        defer wg.Done()

        i := 0

        for {
            select {
            case <-time.After(3 * time.Second):
                fmt.Println("EXIT: 3 seconds")
                return
            case <-time.After(1 * time.Second):
                fmt.Println(i, "second")
        }
        i++
    }
}()

wg.Wait()
}

我希望这样的控制台结果

0 second
1 second
2 second
EXIT: 3 seconds

但实际上是这样的

0 second
1 second
2 second
3 second
4 second
5 second
6 second
...

这个计时器缺少什么?我该如何解决问题?

最佳答案

是因为for循环。 case <-time.After(3 * time.Second):的循环RightHandSide的每一圈在 select声明评估并给你新的计时器。例如,这种方式应该可以工作

stop := time.After(3 * time.Second)
for {
    select {
        case <-stop:
            fmt.Println("EXIT: 3 seconds")
            return
        case <-time.After(1 * time.Second):
            fmt.Println(i, "second")
    }
}

关于go - 定时器在 Golang 中是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41850612/

相关文章:

mongodb - 在 golang mongodb 中过滤

java - 如何创建一个共享计时器,在第一次初始化后减少

Golang 时间(分秒)

java - 如何在单独的线程中运行任务特定的时间并返回结果?

java - Spring JNDI 查找 EJB 计时器服务

java - 为什么我的 java 计时器根本不重复代码?

input - 如何在 Go 中使用 strconv.Atoi() 方法?

go - 为什么 Go +build 标签会引入作用域问题?

go - FieldA.Eq 未定义(类型 cqlc.BooleanColumn 没有字段或方法 Eq)

python - 如何在一定时间内运行代码?