繁体   English   中英

time.Duration * time.Duration 应用了两次

[英]time.Duration * time.Duration applied twice

假设我有:

t := 10 * time.Second // 10s, 

当 time.Second 再次应用时,幕后发生了什么?

tt := t * time.Second // -2346317h47m53.709551616s

https://play.golang.org/p/upyjGgsuVQm

time.Duration值是表示纳秒数的数值。

Duration 将两个瞬间之间的经过时间表示为 int64 纳秒计数。 该表示将最大可表示持续时间限制为大约 290 年。

 type Duration int64

无论您在time.Duration值上执行什么算术运算,它们都以数字方式执行,就像在int64值上一样。

time.Second是一个(键入的)常数,保存一秒内的纳秒数,因此将其乘以10将得到 10 秒内的纳秒数。 这“完全”适合int64数字。 正如文档所述, int64最多可以存储大约 290 年的纳秒数。

现在,如果t在 10 秒内保持纳秒数,然后将其乘以 1 秒内的纳秒数,使用 64 位整数,则会溢出:

fmt.Println(math.MaxInt64)
fmt.Print(int64(10*time.Second), "*", int64(time.Second))

输出:

9223372036854775807
10000000000*1000000000

注意t是一个变量,所以溢出是可以的。 Go 中的常量是精确值,不会溢出。 所以10 * time.Second * time.Second将是一个不适合int64的常量值,因此当您尝试将结果分配给由int64支持的变量时会出错。 有关详细信息,请参阅Go 编译器对常量表达式和其他表达式的评估是否不同

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM