登录
首页 >  Golang >  Go问答

为什么 'tick := time.Tick(time.Second)' 每 2 秒间隔一次而不是每 1 秒间隔一次

来源:stackoverflow

时间:2024-02-15 10:54:22 199浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《为什么 'tick := time.Tick(time.Second)' 每 2 秒间隔一次而不是每 1 秒间隔一次》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

这很简单,但我不明白......

我正在尝试设定一个时间。每秒滴答一次...但它每 2 秒滴答一次?!?

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("Hello, playground")
    
    iterationIndex := 0
    tick := time.Tick(time.Second)
    done := make(chan bool, 1)

    for _ = range tick {
        select {
        case <-tick:
            iterationIndex++
            if iterationIndex >= 10{
                done <- true
            }
            fmt.Printf("%s\n", time.Now().Format("15:04:05.000000"))
        case <-done:
            return
        }
    }
}

演示链接 https://play.golang.org/p/wkhnnk2brpd


解决方案


这是错误所在:

for _ = range tick {
        select {
        case <-tick:

发生的情况是,您通过 for _ = range tick 获得一个勾号,并通过 select { case <-tick:.并且您始终记录第二个刻度。

要记录每个价格变动,您需要执行以下操作:

for {
        select {
        case <-tick:
            iterationindex++
            if iterationindex >= 10{
                done <- true
            }
            fmt.printf("%s\n", time.now().format("15:04:05.000000"))
        case <-done:
            return
        }
    }

在这里您可以处理并记录每个刻度。

编辑:

如果您确实想使用 for ... range 语句,您可以执行以下操作:

for _ = range tick{
    if iterationIndex >= 10{
        break
    }
    iterationIndex++
        
    fmt.Printf("%s\n", time.Now().Format("15:04:05.000000"))
}

本篇关于《为什么 'tick := time.Tick(time.Second)' 每 2 秒间隔一次而不是每 1 秒间隔一次》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>