首页 > 后端开发 > Golang > 为什么 Go 的 time.Duration 除以浮点数有时会失败?

为什么 Go 的 time.Duration 除以浮点数有时会失败?

Linda Hamilton
发布: 2024-12-10 02:57:10
原创
935 人浏览过

Why Does Dividing Go's `time.Duration` by a Floating-Point Number Sometimes Fail?

以浮点持续时间分数睡眠

在 Go 中,将持续时间除以浮点值可能会导致意外行为。考虑以下示例:

s := time.Hour / 73.0
fmt.Println("sleeping: ", s)
time.Sleep(s)
登录后复制

此代码成功打印持续时间“1m38s12ms”并使程序休眠该时间。但是,此代码失败:

d := 73.0
s := time.Hour / d
fmt.Println("sleeping: ", s)
time.Sleep(s)
登录后复制

错误:

invalid operation: time.Hour / d (mismatched types time.Duration and float64)
登录后复制

为什么这两个代码的行为不同?

类型系统和常量转换

在第一个代码中,常量 73.0 是一个无类型数值常量。当在表达式中使用时,Go 会根据上下文自动将其转换为适当的类型。在本例中,time.Hour 的类型为 time.Duration,因此 73.0 会转换为 time.Duration。

但是,在第二个代码中,d 被显式声明为 float64 类型。当将 time.Hour 除以 d 时,Go 会尝试将 time.Duration 与 float64 进行除法,这是不允许的。

转换为 time.Duration

使第二个代码工作时,d 必须转换为 time.Duration。有多种方法可以实现此目的:

  1. 显式转换:
s := time.Hour / time.Duration(d)
登录后复制
  1. 将 d 声明为时间。持续时间:
d := time.Duration(73.0)
s := time.Hour / d
登录后复制
  1. 使用类型alias:
type Duration64 float64
d := Duration64(73.0)
s := time.Hour / time.Duration(d)
登录后复制

将浮点值转换为 time.Duration 时,如果该值无法用 int64 表示,则可能会丢失精度。在这些情况下,可能需要反向转换:

s := time.Duration(float64(time.Hour) / d)
登录后复制

以上是为什么 Go 的 time.Duration 除以浮点数有时会失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板