猿问

为什么在 Go 中将两个 time.durations 相除会导致

我不明白time.Duration在 Go 中划分 a 是什么意思。


例如,这是超级可爱的:


d,_ := time.ParseDuration("4s")

fmt.Println(d/4)

打印1s。这是 ace,因为(天真地)4 秒除以 4 是 1 秒。


但是当我们发现分母中的 4 必须是一个持续时间时,它会有点混乱。所以虽然:


d1 := time.Duration(4)

fmt.Println(d/d1)

也打印1s,我们知道d1实际上是这样4ns,我完全不相信 4 秒除以 4 纳秒是 1 秒。


我很困惑,因为持续时间除以持续时间应该是无量纲的(我认为,对吧?),而持续时间除以无量纲数应该有时间单位。


而且我知道类型 != unit,但我显然误解了某些东西,或者很可能是一组东西。任何帮助解决这个问题将不胜感激!


这是上述示例的 go 操场。https://play.golang.org/p/Ny2_ENRlX6。仅就上下文而言,我正在尝试计算事件之间的平均时间。我可以在几秒钟内恢复使用漂浮物,但我试图留在time.Duration陆地上。


婷婷同学_
浏览 325回答 3
3回答

潇潇雨雨

从数学上讲,你是正确的:除以两个时间。持续时间应该导致一个无量纲的数量。但这不是 go 的类型系统的工作原理。任何数学运算都会产生与输入相同类型的值。您必须将除法结果显式转换为 int64 以获得“无类型”数量。

天涯尽头无女友

之所以如此,是因为time.Duration是int64。请参阅时间包的文档。您将 4000000000(4s)除以 4(4ns),得到 1000000000(1s)。您应该查看操作,因为它们在整数未键入值的情况下。TypeDuration使它看起来像一个物理值,但对于除法运算,它只是一个数字。

慕容708150

没有附加到time.Duration. Atime.Duration通过提供独特的类型(即time.Duration类型)来表示持续时间的物理概念(以秒为单位测量并具有单位)。但从技术上讲,它只是一个uint64.如果您尝试将实际单位附加到类型,您将进入单位地狱: (time.Duration * time.Duration)/acceleration.Radial * mass.MetricTon 是什么?最有可能未定义。
随时随地看视频慕课网APP

相关分类

Go
我要回答