Ответ вслух Junior Типы и нулевые значения обновлено

Преобразования типов в Go

Вопрос

Почему в Go нельзя сложить int и int64 без явного преобразования? Как работают преобразования и какие ловушки вы знаете?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Go намеренно запрещает неявные преобразования: так не бывает тихих потерь точности и сюрпризов как в C. Поэтому a + b для int и int64 не компилируется, пишут int64(a) + b.

Что должно прозвучать в ответе

  • В 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 ошибок.

Термины по теме