【问题标题】:How timers work in Golang [duplicate]计时器在 Golang 中的工作原理 [重复]
【发布时间】:2017-01-25 11:35:29
【问题描述】:

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

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
...

此计时器缺少什么以及如何解决问题?

【问题讨论】:

    标签: go time timer


    【解决方案1】:

    这是因为 for 循环。 select 语句中 case &lt;-time.After(3 * time.Second): 的每个循环 RightHandSide 循环都被评估并为您提供新的计时器。例如,事情应该这样工作

    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")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 2014-11-01
      • 2019-07-04
      相关资源
      最近更新 更多