首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >time.Duration * time.Duration申请了两次

time.Duration * time.Duration申请了两次
EN

Stack Overflow用户
提问于 2020-07-13 20:37:40
回答 1查看 66关注 0票数 0

假设我有:

代码语言:javascript
复制
t := 10 * time.Second // 10s, 

当time.Second再次被应用时,场景后面发生了什么?

代码语言:javascript
复制
tt := t * time.Second // -2346317h47m53.709551616s

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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秒内的纳秒数,就会溢出:

代码语言:javascript
复制
fmt.Println(math.MaxInt64)
fmt.Print(int64(10*time.Second), "*", int64(time.Second))

产出:

代码语言:javascript
复制
9223372036854775807
10000000000*1000000000

请注意,t是一个变量,因此溢出是可以的。Go中的常量是精确的值,不会溢出。因此,10 * time.Second * time.Second将是一个不适合于int64的常量值,因此当您试图将结果赋值给一个由int64支持的变量时,它会产生一个错误。有关详细信息,请参阅Does Go compiler's evaluation differ for constant expression and other expression

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62883887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档