去不匹配的类型uint64和int32

时间:2016-02-25 23:30:59

标签: go

我不知道我在这里犯了什么错误这个错误,两者都是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:无效操作:结果+(now.Usec - oldTime.Usec)(类型不匹配uint64和int32)

4 个答案:

答案 0 :(得分:1)

使用带符号的返回值(int64),例如Timeval.SecTimeval.Usec。使用TimevalToNsec可跨操作系统进行移植。例如,Timeval字段可以是int32int64。要获得正确的结果,请使用

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

答案 1 :(得分:0)

$("button.expand").click(function(e){ e.preventDefault(); $(this).toggleClass("active"); $('.toggleContent').slideToggle('slow'); return false; }); 定义为Timeval.Usec。也许int32也应该result?或者,如果您想使用int32,可以按uint64投射。

答案 2 :(得分:0)

最简单的解决方案是:

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故意测试上述内容,则该功能将失败。如果您想要涵盖此类案件,则需要进行检查(两次转换为Usec)。

答案 3 :(得分:0)

结果是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

}