首页 > 后端开发 > Golang > 为什么 Go 的 time.Sleep() 会根据常量类型以不同方式处理小数持续时间?

为什么 Go 的 time.Sleep() 会根据常量类型以不同方式处理小数持续时间?

Barbara Streisand
发布: 2024-12-30 06:05:09
原创
336 人浏览过

Why Does Go's `time.Sleep()` Handle Fractional Durations Differently Based on Constant Type?

Go 中睡眠持续时间的分数

问题:

为什么以下 Go 会出现以下情况代码成功休眠一小部分持续时间,而第二个代码失败?

// Success
s := time.Hour / 73.0
fmt.Println("sleeping: ", s)
time.Sleep(s)

// Failure
d := 73.0
s := time.Hour / d
fmt.Println("sleeping: ", s)
time.Sleep(s)

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

答案:

区别在于每行除数的类型:

  • Success: 73.0 是一个无类型数字常量,它适应时间。持续时间表达式 time.Hour / 73.0.
  • Failure: d 显式键入为 float64,无法除以 time.Duration。

第二行工作,您必须将 d 转换为时间。持续时间:

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

或使用一个以下替代方法之一:

  • d := time.Duration(73.0)
  • var d time.Duration = 73.0

对于不能的值以time.Duration表示,如73.5,time.Hour必须转换为float64:

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

进一步注意事项:

  • 常量: 像 time.Hour 这样的常量具有无法更改的类型,因此它们不能直接与不兼容的设备一起使用types.
  • 无类型常量:无类型常量采用它们所使用的上下文的类型。在第一行中,73.0 适应 time.Duration。
  • 类型转换: 像 time.Duration(d) 这样的显式类型转换对于确保不同类型之间的兼容性是必要的类型。

以上是为什么 Go 的 time.Sleep() 会根据常量类型以不同方式处理小数持续时间?的详细内容。更多信息请关注PHP中文网其他相关文章!

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