2016-02-25 4 views
2

я не вижу, что я делаю неправильно здесь с этой ошибкой, оба типа syscall.Timeval USECидут несоответствующие типы uint64 и int32

Благодаря

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

Timeval.Usec определяется как int32. Может быть, result также должен быть int32? Альтернативно, если вы хотите использовать uint64, вы можете наложить его на uint64(now.Usec - oldTime.Usec).

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 
+0

совершенным, благодаря – dgress

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), если вы хотите охватить такие случаи.

+0

спасибо, все еще получает: – dgress

+0

недействительный оператор ion: (now.Sec - oldTime.Sec) * 1000000 + (now.Usec - oldTime.Usec) (несовпадающие типы int64 и int32) – dgress

+0

@dgress добавил int64() вокруг второй части. Теперь он должен работать. – user1952500

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 

Как ни странно, в дороге документы следующие

type Timeval struct { 
    Sec int64 
    Usec int64 

}

+0

Спасибо за обновление и команду reflect.TypeOf (xxxx), что, безусловно, поможет в других проблемах, которые могут возникнуть в следующем документе. Я предполагаю, что ошибка против go doc в порядке. – dgress

+0

На самом деле я просто понял, что более простой способ печати - fmt.Printf («тип Timeval.Usec% T \ n», now.Usec) – factotum

Смежные вопросы