我有一个
float64
,其中包含以秒为单位的持续时间。我正在寻找一种方法将此值转换为 time.Duration
。我能够执行此转换,但我想知道是否没有更优雅的方法。
我的方法是这样的:
var timeout float64 // input value of float type
var res time.Duration // result value of time.Duration type
res += time.Duration(math.Round(timeout)) * time.Second
timeout -= math.Round(timeout)
timeout *= 1000
res += time.Duration(math.Round(timeout)) * time.Millisecond
timeout -= math.Round(timeout)
timeout *= 1000
res += time.Duration(math.Round(timeout)) * time.Microsecond
timeout -= math.Round(timeout)
timeout *= 1000
res += time.Duration(math.Round(timeout)) * time.Nanosecond
return res
我不喜欢这个的是它很麻烦而且不可靠。我希望 Go 能够开箱即用地提供类似的东西,并以检测溢出和类似范围违规的方式执行这些转换。似乎 Go 还没有,但也许我错过了一些明显的东西,因此我的问题。
备注:
如JimB 的评论所示,将秒数乘以每秒持续时间单位数。持续时间以纳秒为单位测量,但您的代码不需要知道该细节。
return time.Duration(timeout * float64(time.Second))
转换为浮点数进行乘法,然后转换为持续时间以获得结果。
或者,您可以将超时转换为持续时间并乘以时间。第二个常数。
return time.Duration(timeout) * time.Second
我不确定这里出了什么问题。您的要求很容易实现:
package main
import (
"fmt"
"time"
)
func duration(f float64) time.Duration {
return time.Duration(f * 1e9)
}
func main() {
t := duration(9)
fmt.Println(t) // 9s
}
实际上就是一行代码,这有什么不优雅的呢?它可以更优雅的唯一方法是如果
time.Duration
本身就是 float64
。这是没有意义的,因为 Go 不会跟踪任何小于纳秒的东西。
time.Duration(timeout) * time.Second