猿问

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

我有一个循环,我从 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)


侃侃尔雅
浏览 165回答 2
2回答

一只萌萌小番薯

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

RISEBY

作为其他编程语言的开发人员,我发现这是最违反直觉和不合逻辑的做法。在过去的 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 := 60var 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 mainimport (    "fmt"    "time")func main() {    var oneMinute = 1 * time.Minute    var oneNanosecond = 1 * time.Nanosecond    var oneMinuteTimesOneNanoSecond = oneMinute * oneNanosecond        fmt.Println(oneMinuteTimesOneNanoSecond)}结果正是我对这种荒谬的时间计算方式的预期:1m0s我会学会忍受这个,但我永远不会喜欢它。
随时随地看视频慕课网APP

相关分类

Go
我要回答