[英]time.Duration * time.Duration applied twice
假设我有:
t := 10 * time.Second // 10s,
当 time.Second 再次应用时,幕后发生了什么?
tt := t * time.Second // -2346317h47m53.709551616s
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.