假设我有:
t := 10 * time.Second // 10s, 当time.Second再次被应用时,场景后面发生了什么?
tt := t * time.Second // -2346317h47m53.709551616s发布于 2020-07-13 20:50:25
time.Duration值是表示纳秒数的数值。
持续时间表示两个瞬间之间经过的时间,表示为int64纳秒计数。代表人数将可代表的最长期限限制在大约290年。类型持续时间int64
无论您对time.Duration值执行什么算术,它们都是在数字上执行的,就像对int64值一样。
time.Second是一个(类型化)常量,它在1秒内保持纳秒数,因此将它乘以10将在10秒内给出纳秒数。这“完全”符合一个int64号码。正如文档所述,int64可以存储长达290年的纳秒数。
现在,如果t在10秒内保持纳秒数,然后用64位整数乘以1秒内的纳秒数,就会溢出:
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支持的变量时,它会产生一个错误。有关详细信息,请参阅Does Go compiler's evaluation differ for constant expression and other expression
https://stackoverflow.com/questions/62883887
复制相似问题