首页 >后端开发 >Golang >如何在 Go 中正确睡眠一小部分时间?

如何在 Go 中正确睡眠一小部分时间?

Linda Hamilton
Linda Hamilton原创
2024-12-06 04:28:13667浏览

How to Correctly Sleep for Fractions of a Time Duration in Go?

按持续时间的一小部分进行睡眠

在 Go 中,可以使用 time.Sleep 来实现持续时间的一小部分的睡眠。 () 函数,它以 time.Duration 作为参数。但是,当尝试指定持续时间的一小部分时,根据代码结构,可能会遇到不同的行为。

考虑以下两种情况:

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

// Case 2: Fails
d := 73.0
s := time.Hour / d
fmt.Println("sleeping: ", s)
time.Sleep(s) // Error: time.Hour / d (mismatched types time.Duration and float64)

在情况 1 中,代码成功休眠了不到一个小时,而在情况 2 中,它因类型不匹配错误而失败。要理解其中的原因,掌握 Go 中如何处理常量和类型至关重要。

理解常量表达式

在 Go 中,常量是强类型的,也可以是无类型的(使用默认类型)或显式键入。

在情况 1 中,time.Hour 是 type 的类型常量时间.持续时间.将 time.Hour 除以 73.0 时,Go 会自动将无类型常量 73.0 转换为 time.Duration,得到表达式 time.Hour / time.Duration(73.0).

推断类型和不匹配类型

在情况 2 中,d 是一个无类型常量,初始化为73.0。由于需要类型,Go 根据常量值推断类型,导致 d 变成 float64。

随后,当尝试将 time.Hour 除以 d(现在是 float64 类型)时,Go 检测到类型不匹配。 Go 中不允许对 time.Duration 和 float64 进行除法。

解决类型不匹配问题

要解决类型不匹配问题,可以将 d 显式转换为 time.Duration在执行除法之前:

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

或者,d 可以直接定义为时间。Duration变量:

d := time.Duration(73.0)
s = time.Hour / d

或者,在变量声明中使用类型转换:

var d time.Duration = 73.0
s = time.Hour / d

处理无法按时间表示的值。持续时间

如果除法结果无法用 time.Duration 表示(例如,将一小时除以 73.5),请转换time.Hour 转换为 float64,执行除法,然后将结果转换为 time.Duration:

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

通过了解类型转换规则并在必要时显式处理转换,可以成功睡眠一小部分Go 中的持续时间。

以上是如何在 Go 中正确睡眠一小部分时间?的详细内容。更多信息请关注PHP中文网其他相关文章!

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