首页 >后端开发 >Golang >为什么 `time.Hour / 73.0` 在 Go 中可以工作,但 `time.Hour / d` 却失败?

为什么 `time.Hour / 73.0` 在 Go 中可以工作,但 `time.Hour / d` 却失败?

Patricia Arquette
Patricia Arquette原创
2024-12-04 18:01:16285浏览

Why Does `time.Hour / 73.0` Work in Go, But `time.Hour / d` Fail?

将 Duration 转换为浮点数并返回

在 Go 中,当尝试对持续时间、浮点数和无类型常量执行操作时,您可能会遇到不同的行为。下面仔细看看两行类似的代码,以及为什么其中一行可以工作而另一行不行。

工作行:time.Hour / 73.0

表达式 time.Hour / 73.0 是简短的变量声明。右侧表达式是 time.Duration(一小时的常量值)和无类型数值常量 (73.0) 之间的除法。

由于 time.Duration 是整数类型 (int64),因此无类型数值常量常量转换为 time.Duration (不损失精度)。因此,除法将得到一个 time.Duration 值,该值可用于睡眠指定的一小时。

失败行:time.Hour / d

相反,表达式 time.Hour / d 失败,因为 d 的类型不正确。

在第一行中,d 被声明为 float64,因为从无类型常量 73.0 推导出类型。但是,当您尝试将 time.Hour(时间.Duration)除以 d(float64)时,Go 会引发类型不匹配错误,因为您无法直接对不同类型进行操作。

使其工作:

要使这条线起作用,您需要将 d 转换为 time.Duration。有几种方法可以做到这一点:

  • 显式转换: s := time.Hour / time.Duration(d)
  • 类型转换: s := 时间.小时 / time.Duration(d)
  • 持续时间分配: d := time.Duration(73.0)

或者,您可以将 time.Hour 转换为 float64 ,执行除法,并将结果转换回time.Duration:

d := 73.5
s := time.Duration(float64(time.Hour) / d)

理解非类型化常量:

非类型化常量可以根据使用的上下文而采用不同的类型。在本例中,无类型常量 73.0 采用 float64 类型,因为它在分配给 float64 变量 d 的表达式中使用。但是,在表达式 time.Hour / 73.0 中,该常量被转换为 time.Duration,因为它用于具有 time.Duration 值的运算。

以上是为什么 `time.Hour / 73.0` 在 Go 中可以工作,但 `time.Hour / d` 却失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn