我如何在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 with 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
$ 

Go相关问答推荐

Go-Colly:将数据切片为POST请求

如何存储来自异步Goroutine的返回值列表?

如何预编译Golang标准库?

如何使用Gorilla WebSockets实现Http.Hijacker&;alexedwards/scs/v2

如何在GoFr中为生产和本地环境设置不同的配置?

可以';t从主机连接到ScyllaDB容器

为什么要立即调用内联函数,而不仅仅是调用其包含的函数?

为什么 `go mod` 占用了另一个磁盘上的空间而不是我的 GOPATH?

Go Gin:验证 base64

Golang telegram 机器人

Json.Unmarshal() 和 gin.BindJson() 之间的区别

Golang校验器包:重命名字段错误处理

如何将 DirName 和 serial 添加到 X509v3 Authority Key Identifier

获取 nil 指针类型的 reflect.Value

闭包所处的环境范围是什么?

如何从 Go 中的 `HijackedResponse` 中删除 Cursor Position ANSI 转义码?

NaN 是 golang 中的可比类型吗?

在 Raspberry Pi4 上下载 Go Mod

转到文本/模板模板:如何根据模板本身的值数组判断值?

Go Flag 用法 描述 包含 Word 值