为了账号安全,请及时绑定邮箱和手机立即绑定

去不匹配的类型 uint64 和 int32

去不匹配的类型 uint64 和 int32

Go
慕的地6264312 2021-12-20 10:00:47
我不明白我在这里做错了什么,这个错误,两者都是类型 syscall.Timeval Usec谢谢package commonimport (    "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)
查看完整描述

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


查看完整回答
反对 回复 2021-12-20
?
largeQ

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如果您想涵盖此类情况,则需要进行检查(两次都转换为)。


查看完整回答
反对 回复 2021-12-20
?
慕莱坞森

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

}


查看完整回答
反对 回复 2021-12-20
  • 3 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信