> Что лучше использовать в Go: int8, int32, int64 или просто int (Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: Wildberries

Стек: Go

> Пример ответа

Короткий ответ

В Go выбор типа зависит от контекста: int - оптимален для общих вычислений, индексов и размеров, так как соответствует разрядности платформы (64 бита на большинстве систем). Фиксированные типы (int8, int32, int64) нужны для бинарных форматов, сериализации, работы с протоколами или когда важен диапазон значений и размер в памяти. Для большинства backend-задач используйте int - это идиоматично и безопасно.

Подробное объяснение

int в Go - это алиас для архитектурно-зависимого целого: на 64-битных платформах это int64, на 32-битных - int32. Это даёт два ключевых преимущества:

  1. Переносимость - код компилируется и работает корректно на любой архитектуре без изменений.
  2. Производительность - операции с int компилируются в нативные инструкции CPU без лишних конверсий.

Фиксированные типы (int8, int16, int32, int64) нужны, когда:

  • Размер важен - например, при хранении больших массивов чисел, где каждый байт экономит память.
  • Формат данных задан внешне - JSON, protobuf, бинарные протоколы, файловые форматы.
  • Арифметика с переполнением - когда нужно контролировать диапазон значений (например, int8 от -128 до 127).
  • Совместимость с C-библиотеками - через cgo или unsafe-операции.

Важный нюанс: int и int64 - это разные типы, их нельзя неявно смешивать в выражениях. Это защищает от ошибок переполнения, но требует явных конверсий.

На практике

Для backend-разработки на Go:

  • Индексы, счётчики, длины - всегда int (например, len(), range, slice).
  • ID, timestamp, большие числа - int64 (стандарт для баз данных и API).
  • Флаги, коды статусов - int8 или int32, если нужна экономия памяти в структурах.
  • Бинарные данные - фиксированные типы с явным указанием порядка байт (encoding/binary).
  • JSON - по умолчанию числа декодируются в float64, но для целых лучше использовать int64 через json.Number или кастомную десериализацию.

Правило: если нет явной причины использовать фиксированный тип - используйте int. Это упрощает чтение кода и избегает неожиданных конверсий.

Пример кода

GO
// Правильно: int для индексов и размеров
func sum(nums []int) int {
total := 0
for i := 0; i < len(nums); i++ {
total += nums[i]
}
return total
}
// Правильно: int64 для ID и внешних форматов
type User struct {
ID int64 `json:"id"`
Name string `json:"name"`
}
// Правильно: int8 для компактного хранения флагов
type Flags struct {
Read int8 // 0 или 1
Write int8
}
// Ошибка: смешение типов
func bad() {
var a int = 10
var b int64 = 20
// c := a + b // compile error: mismatched types
c := int64(a) + b // нужна явная конверсия
_ = c
}

Как отвечать на собеседовании

Начните с прямого ответа: int - для общего кода, фиксированные - для специфических задач. Затем приведите примеры из практики: int для индексов, int64 для ID, int8 для флагов. Упомяните, что int архитектурно-зависим, и это фича, а не баг. Подчеркните, что неявные конверсии запрещены - это осознанный дизайн для безопасности. Если спросят про производительность, скажите, что int обычно быстрее, но разница заметна только в hot path с миллионами операций.

Что проверяет интервьюер

Интервьюер оценивает:

  • Понимание разницы между архитектурно-зависимыми и фиксированными типами.
  • Умение обосновать выбор типа под конкретную задачу.
  • Знание идиоматического Go (использование int по умолчанию).
  • Понимание ограничений типизации (отсутствие неявных конверсий).
  • Практический опыт - примеры из реальных проектов.

Типичные ошибки

  • Использование int64 везде "для надёжности" - это усложняет код без выгоды.
  • Попытка смешивать int и int64 в выражениях без конверсии - ошибка компиляции.
  • Игнорирование переполнения: int8 легко переполняется, нужно проверять диапазоны.
  • Использование int для бинарных протоколов - размер зависит от платформы, что ломает совместимость.
  • Путаница между int и uint - беззнаковые типы нужны только для битовых операций или когда отрицательные значения невозможны.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью