2015-03-27 3 views
2

Я работал над метапрограммированием с использованием пакетов, и я столкнулся с ошибкой constant 9223372036854775807 overflows int при появлении math.MaxInt64 и math.MaxUint64.Go - math.MaxInt64 и ошибка ввода типа

Я изолировав его в двух случаях:

Действительно

var a int64 = math.MaxInt64 
b := interface{}(int64(math.MaxInt64)) 

Не действует

a := math.MaxInt64 
b := interface{}(math.MaxInt64) 

https://play.golang.org/p/U1QDmFbV29

Похоже, что Go не делает правильный тип умозаключение.

Является ли это ошибкой или ожидаемым поведением? И если вы ожидаете, кто-нибудь знает, почему?

+0

Возможно, это связано с тем, что вы используете Go в 32-разрядной среде. На 64-битной машине оба выражения прекрасны. –

+0

Не это. Обе ОС и Go - 64 бит. –

+0

вы уверены? Что означает 'go env GOARCH'? – JimB

ответ

7

math.MaxInt64 является Untyped Constant. Числовые константы представляют значения произвольной точности и не переполняются. Когда вы назначаете это переменной, ее нужно преобразовать в числовой тип, и если ни один не указан, то по умолчанию используется int.

Поскольку тип int в Go представляет собой собственный размер для вашей архитектуры, это будет переполняться в системах с 32-разрядным int.

+0

Спасибо! Что объясняет его. –

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