为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 for 循环中创建持续时间 -(不匹配类型 int 和 time.Duration)

如何在 for 循环中创建持续时间 -(不匹配类型 int 和 time.Duration)

Go
侃侃尔雅 2023-06-01 15:10:58
我有一个循环,我从 time.Time 开始,我要添加一分钟。 for idx := range keys {    var a = idx * time.Minute    var t = tInit.Add(time.Minute * a)    fmt.Println(t, idx) }这是我的错误invalid operation: idx * time.Minute (mismatched types int and time.Duration)
查看完整描述

2 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

数字运算的操作数必须具有相同的类型。将值转换为intidxtime.Durationvar a = time.Duration(idx) * time.Minute



查看完整回答
反对 回复 2023-06-01
?
RISEBY

TA贡献1856条经验 获得超5个赞

作为其他编程语言的开发人员,我发现这是最违反直觉和不合逻辑的做法。在过去的 10 年里,我在 Scala 工作过,它可以像这样简单:


val a = idx minutes


相比之下,Go 方式:


var a = time.Duration(idx) * time.Minute


更冗长,但这不会是世界末日。


问题在于,如果您想要获得另一个 Duration 作为结果,则将 Duration 与另一个 Duration 相乘没有任何意义,因为从物理角度来看,这将以秒的平方来衡量。


根据文档 time.Minute 是一个常数:


const (

    Nanosecond  Duration = 1

    Microsecond          = 1000 * Nanosecond

    Millisecond          = 1000 * Microsecond

    Second               = 1000 * Millisecond

    Minute               = 60 * Second

    Hour                 = 60 * Minute

)

所有这些都是根据 Duration 类型定义的,它是 int64 的别名:


type Duration int64

据我所知,将整数文字与这些常量中的每一个相乘是非常好的,毕竟这就是每个常量相对于其他常量的定义方式。


因此,回顾一下为什么60 * time.Second语法是有效的(并且非常有意义),但是:


var secondsInAMinute := 60


var oneMinute = secondsInAMinute * time.Second

是无效的。这没有任何意义。


所有这些常量都是 Duration 类型。这意味着它们是以时间为单位测量的(准确地说是一纳秒的倍数)。


因此,似乎“正确”的方法(在编译和工作的意义上是正确的)没有任何物理意义。让我们再看看这个:


var a = time.Duration(idx) * time.Minute


因此,我们将 time.Duration(idx) 与 time.Minute 相乘。


的类型time.Minute是 Duration ,应该用时间单位来衡量。在物理学中,公认的时间单位是秒。似乎 Go 使用整数纳秒代替,所以 time.Minute 表示持续时间,在内部以纳秒表示。没关系。


问题在于它time.Duration(idx)还将整数 idx“转换”为持续时间,因此在物理学中它也将表示为时间单位,如秒。因此,相应地,我认为 time.Duration(idx)idx nanoseconds在 Go 中代表。


所以,基本上,当我们写的时候,time.Duration(idx) * time.Minute我们是将idx nanoseconds(idx * 0.0000000001 秒) 与one minute(60 秒) 相乘。


所以,从物理的角度来看time.Duration(idx) * time.Minute将代表idx * 0.000000001 seconds * 60 seconds. 或者,简化,idx * 0.00000006 seconds squared.


现在,在哪个世界idx * 0.00000006 seconds squared等于idx * 1 minute?


所以,现在我知道,在 Go 中,如果你想对一个持续时间应用一个乘数,你必须将该持续时间乘以另一个持续时间,然后在你的脑海中将它除以这样所有这些混乱仍然可以具有任何物理one millisecond意义.


我知道所有这些单位不一致都是“数字运算的操作数必须具有相同类型”的结果。约束。但这并不能使它更合乎逻辑或不那么烦人。在我看来,应该取消对 Go 语言的限制。


但是,对于任何在我的解释中迷失的人,让我们通过一个具体的代码示例看看这一切是多么不合逻辑:


package main


import (

    "fmt"

    "time"

)


func main() {

    var oneMinute = 1 * time.Minute

    var oneNanosecond = 1 * time.Nanosecond


    var oneMinuteTimesOneNanoSecond = oneMinute * oneNanosecond

    

    fmt.Println(oneMinuteTimesOneNanoSecond)

}

结果正是我对这种荒谬的时间计算方式的预期:


1m0s

我会学会忍受这个,但我永远不会喜欢它。


查看完整回答
反对 回复 2023-06-01
  • 2 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信