我不知道我在这里犯了什么错误这个错误,两者都是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)
答案 0 :(得分:1)
使用带符号的返回值(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
答案 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
}