> Что лучше использовать в Go: int8, int32, int64 или просто int (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Wildberries
Стек: Go
> Пример ответа
Короткий ответ
В Go выбор типа зависит от контекста: int - оптимален для общих вычислений, индексов и размеров, так как соответствует разрядности платформы (64 бита на большинстве систем). Фиксированные типы (int8, int32, int64) нужны для бинарных форматов, сериализации, работы с протоколами или когда важен диапазон значений и размер в памяти. Для большинства backend-задач используйте int - это идиоматично и безопасно.
Подробное объяснение
int в Go - это алиас для архитектурно-зависимого целого: на 64-битных платформах это int64, на 32-битных - int32. Это даёт два ключевых преимущества:
- Переносимость - код компилируется и работает корректно на любой архитектуре без изменений.
- Производительность - операции с
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 := 0for 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 или 1Write int8}// Ошибка: смешение типовfunc bad() {var a int = 10var b int64 = 20// c := a + b // compile error: mismatched typesc := int64(a) + b // нужна явная конверсия_ = c}
Как отвечать на собеседовании
Начните с прямого ответа: int - для общего кода, фиксированные - для специфических задач. Затем приведите примеры из практики: int для индексов, int64 для ID, int8 для флагов. Упомяните, что int архитектурно-зависим, и это фича, а не баг. Подчеркните, что неявные конверсии запрещены - это осознанный дизайн для безопасности. Если спросят про производительность, скажите, что int обычно быстрее, но разница заметна только в hot path с миллионами операций.
Что проверяет интервьюер
Интервьюер оценивает:
- Понимание разницы между архитектурно-зависимыми и фиксированными типами.
- Умение обосновать выбор типа под конкретную задачу.
- Знание идиоматического Go (использование
intпо умолчанию). - Понимание ограничений типизации (отсутствие неявных конверсий).
- Практический опыт - примеры из реальных проектов.
Типичные ошибки
- Использование
int64везде "для надёжности" - это усложняет код без выгоды. - Попытка смешивать
intиint64в выражениях без конверсии - ошибка компиляции. - Игнорирование переполнения:
int8легко переполняется, нужно проверять диапазоны. - Использование
intдля бинарных протоколов - размер зависит от платформы, что ломает совместимость. - Путаница между
intиuint- беззнаковые типы нужны только для битовых операций или когда отрицательные значения невозможны.
> Похожие задачи по backend
Что такое WebSocket и как он работает
Писали ли интеграционные тесты или моки для сервисов с Dependency Injection
Как запустить профилировщик в Go
Какая команда помогает понять, что происходит при запросе к базе данных для поиска узких мест по производительности
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью