3 回答
TA贡献2012条经验 获得超12个赞
使用有符号的返回值 ( int64),例如Timeval.Sec和Timeval.Usec。使用TimevalToNsec跨操作系统的可移植性。例如, Timeval字段可能是int32或int64。为了获得正确的结果,请使用,
package main
import (
"fmt"
"syscall"
"time"
)
func getUsecSince(old syscall.Timeval) int64 {
var now syscall.Timeval
syscall.Gettimeofday(&now)
nsecs := syscall.TimevalToNsec(now) - syscall.TimevalToNsec(old)
return nsecs / int64(time.Microsecond)
}
func main() {
old := syscall.Timeval{}
syscall.Gettimeofday(&old)
time.Sleep(2*time.Second + 42*time.Microsecond)
fmt.Println(getUsecSince(old))
}
输出:
2000377
TA贡献2039条经验 获得超7个赞
对此最简单的解决方案是:
func getUsecSince(oldTime syscall.Timeval) (result uint64) {
now := syscall.Timeval{}
syscall.Gettimeofday(&now)
// Automatically ignore cases like 12.5 - 11.8
result = uint64((now.Sec - oldTime.Sec) * 1000000 + int64(now.Usec - oldTime.Usec))
return result
}
通过转换为最小单位,只要转换过程中没有溢出,您就可以轻松忽略边界条件。
请注意,如果您oldTime将来故意使用 an 测试上述内容,该功能将失败。Usec如果您想涵盖此类情况,则需要进行检查(两次都转换为)。
TA贡献1810条经验 获得超4个赞
结果是 uint64。其他操作数是 int32 运行这个
now := syscall.Timeval{}
syscall.Gettimeofday(&now)
typeUsec := reflect.TypeOf(now.Usec)
fmt.Printf("type %s, value %d \n", typeUsec, now.Usec)
将打印
type int32, value 238376
奇怪的是,go文档有以下内容
type Timeval struct {
Sec int64
Usec int64
}
- 3 回答
- 0 关注
- 165 浏览
添加回答
举报