从 float64 秒创建 time.Duration

Creating a time.Duration from float64 seconds

我有一个 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 is not there yet,但也许我错过了一些明显的东西,因此我的问题。

备注:

我不确定这里的问题是什么。您的要求实现起来非常简单:

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 不会跟踪任何小于纳秒的东西。

https://golang.org/pkg/time#Duration

, multiply the number of seconds by the number of duration units per second. Durations are measured in nanoseconds,但您的代码不需要知道该细节。

return time.Duration(timeout * float64(time.Second))

将乘法转换为浮点数并转换为持续时间以获得结果。