Преобразования типов в Go
Вопрос
Почему в Go нельзя сложить int и int64 без явного преобразования? Как работают преобразования и какие ловушки вы знаете?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
В Go нет неявных преобразований между именованными типами, даже числовыми
Явная запись `T(x)`; при сужении целых старшие биты отбрасываются
float в int отбрасывает дробную часть к нулю
Нетипизированные константы подстраиваются под тип без конвертации
`string(int)` даёт символ, а не число: нужен strconv
Что могут спросить следом
- Что будет при
int8(300)с переменной и с константой? - Как безопасно проверить, что int64 влезет в int32?
Разбор
Go намеренно запрещает неявные преобразования: так не бывает тихих потерь точности и сюрпризов как в C. Поэтому a + b для int и int64 не компилируется, пишут int64(a) + b. Преобразование целых при сужении отбрасывает старшие биты: int8(x) для переменной x = 300 даст 44. С константой int8(300) компилятор выдаст ошибку, потому что константа не помещается. Из float в int дробная часть отбрасывается к нулю. Нетипизированные константы гибкие: time.Sleep(2 * time.Second) работает, потому что 2 подстраивается под Duration. Отдельная ловушка: string(65) даёт "A", для числа в строку нужен strconv.Itoa. Перед сужением проверяю диапазон через math.MinInt32/math.MaxInt32.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Типы и нулевые значения»
- Перевод числа между системами счисления на Go
- Права доступа битовой маской на Go
- Наименьший целый тип для суммы на Go
- Что выведет Go: преобразования чисел
- Что выведет Go: iota с выражением
- Что выведет Go: затенение переменной в if
- type A = B и type A B
- byte и rune