go - 为什么 'tick := time.Tick(time.Second)' 每 2 秒滴答一次而不是 1 秒

标签 go

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

我正在尝试设定一个时间。每秒滴答一次...但它每 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
        }
    }
}

前往 Playground 的链接 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"))
}

关于go - 为什么 'tick := time.Tick(time.Second)' 每 2 秒滴答一次而不是 1 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64995669/

相关文章:

postgresql - Golang 如何使 sql 行成为一个字符串

arrays - 使用与值匹配的键对映射数组进行排序 GO

go - 这个类型声明是什么意思?

go - 是否为每个版本隔离或共享了drone.io服务?

concurrency - 为什么并发写入的boolean值设置为false后还是true?

go - 如何使用Google云端硬盘API(v3)获取目录中所有文件的列表

mysql - SQL结构和日历?

go - 计算带小数部分的值

bash - Go 和 MongoDB 连接不适用于紧急日志 "no reachable server"

testing - 如何修复 Go 测试输出中的行号?