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

Mik*_*war 5 go

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

例如,这非常可爱:

d,_ := time.ParseDuration("4s")
fmt.Println(d/4)
Run Code Online (Sandbox Code Playgroud)

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

但是,当我们发现分母中的4必须是一个持续时间时,就会有些困惑。因此,尽管:

d1 := time.Duration(4)
fmt.Println(d/d1)
Run Code Online (Sandbox Code Playgroud)

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

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

而且我知道!=单位的类型,但是我显然误会了某些东西,或者很可能是一组东西。任何帮助清除此问题的方法将不胜感激!

这是上述示例的游戏场。https://play.golang.org/p/Ny2_ENRlX6。仅出于上下文考虑,我试图计算事件之间的平均时间。我可以退一步使用浮子几秒钟,但是我试图留在time.Duration陆地上。

Ben*_*ell 5

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


Grz*_*Żur 4

之所以如此,是time.Duration因为int64请参阅time 包的文档。

将 4000000000 (4s) 除以 4 (4ns),得到 1000000000 (1s)。您应该将这些操作视为整数而不是键入的值。类型Duration使它看起来像一个物理值,但对于除法运算来说它只是一个数字。