2016-01-10 3 views
3

Я использую функцию хеша murmur2, которая возвращает мне uint64.Golang: on-int int overflow

Я хочу сохранить его в PostgreSQL, который поддерживает только BIGINT (подписанный 64 бита).

Поскольку меня не интересует сам номер, а только двоичное значение (поскольку я использую его как идентификатор для обнаружения уникальности (мой набор значений составляет ~ 1000 значений, для меня достаточно 64-битного хэша) Я хотел бы, чтобы преобразовать его в int64 от «просто» изменение типа

Как один сделать это в угодной компилятор

ответ

7

Вы можете просто использовать тип conversion:.?

i := uint64(0xffffffffffffffff) 
i2 := int64(i) 
fmt.Println(i, i2) 

Выход:

18446744073709551615 -1 

Преобразование uint64 в int64 всегда удается: он не меняет представление в памяти только тип. То, что может сбить вас с толку, если вы пытаетесь преобразовать нетипизированное целое постоянное значение int64:

i3 := int64(0xffffffffffffffff) // Compile time error! 

Это ошибка времени компиляции в качестве постоянной величины 0xffffffffffffffff (который представлен с произвольной точностью) не укладывается в int64, потому что значение макс, который вписывается в int64 является 0x7fffffffffffffff:

constant 18446744073709551615 overflows int64 
+0

КИ, да я был под ложным впечатлением, о том, как преобразование типа работает, спасибо за разъяснение вещей –