【问题标题】:Get monotonic time, same as CLOCK_MONOTONIC获取单调时间,同CLOCK_MONOTONIC
【发布时间】:2023-02-12 00:19:33
【问题描述】:

如何在 Go 中以纳秒为单位从启动中获取单调时间?我需要以下 C 代码将返回的相同值:

static unsigned long get_nsecs(void)
{
    struct timespec ts;

    clock_gettime(CLOCK_MONOTONIC, &ts);
    return ts.tv_sec * 1000000000UL + ts.tv_nsec;
}

time 包中的函数似乎返回当前时间和/或日期。

【问题讨论】:

    标签: go time clock


    【解决方案1】:

    将 Go 与 cgo 一起使用。

    使用unsigned long long 保证纳秒的 64 位整数值。例如,在 Windows 上,unsigned long 是一个 32 位整数值。

    monotonic.go:

    package main
    
    import "fmt"
    
    /*
    #include <time.h>
    static unsigned long long get_nsecs(void)
    {
        struct timespec ts;
        clock_gettime(CLOCK_MONOTONIC, &ts);
        return (unsigned long long)ts.tv_sec * 1000000000UL + ts.tv_nsec;
    }
    */
    import "C"
    
    func main() {
        monotonic := uint64(C.get_nsecs())
        fmt.Println(monotonic)
    }
    

    $ go run monotonic.go
    10675342462493
    $ 
    

    【讨论】:

    • 这不会在 macOS 上编译。
    • 适用于我:MBP 2012、10.14.6 Mojave,安装了 xcode 命令行实用程序。您未指定的设置必须不同。还有 @rocka2q - 感谢简单的 cgo 示例 - 我第一次尝试! :-)
    • 我在 2019 MacBook Pro 上安装了带有 xcode 命令行实用程序的 Big Sur。
    猜你喜欢
    • 2022-01-24
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 2011-09-15
    • 2012-06-10
    • 2020-03-27
    相关资源
    最近更新 更多