去不匹配的类型 uint64 和 int32

我不明白我在这里做错了什么,这个错误,两者都是类型 syscall.Timeval Usec


谢谢


package common


import (

    "syscall"

)


func getUsecSince(oldTime syscall.Timeval) (result uint64) {

    now := syscall.Timeval{}

    syscall.Gettimeofday(&now)


    for now.Sec > oldTime.Sec {

        result += 1000000

        now.Sec--

    }

    return result + (now.Usec - oldTime.Usec)

}

./common.go:15: invalid operation: result + (now.Usec - oldTime.Usec)(类型不匹配的 uint64 和 int32)


慕的地6264312
浏览 166回答 3
3回答

繁花如伊

使用有符号的返回值 ( int64),例如Timeval.Sec和Timeval.Usec。使用TimevalToNsec跨操作系统的可移植性。例如, Timeval字段可能是int32或int64。为了获得正确的结果,请使用,package mainimport (    "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

largeQ

对此最简单的解决方案是: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如果您想涵盖此类情况,则需要进行检查(两次都转换为)。

慕莱坞森

结果是 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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go