> Какие категории и типы данных существуют (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: YADRO
Стек: Go
> Пример ответа
Короткий ответ
В Go типы данных делятся на базовые (basic types): bool, числовые (int, uint, float, complex), string; составные (composite): array, slice, struct, pointer, function, interface, map, channel. Отдельно выделяют type aliases и defined types. Категории: value types (передаются по значению) и reference types (slice, map, channel, pointer, interface - передаются по ссылке). Также есть unnamed types (литералы) и named types (объявленные через type).
Подробное объяснение
Базовые категории в Go:
- Булевы -
bool(true/false). - Числовые:
- целые:
int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64,uintptr; - с плавающей точкой:
float32,float64; - комплексные:
complex64,complex128; - алиасы:
byte=uint8,rune=int32.
- целые:
- Строки -
string(immutable, UTF-8). - Составные:
array- фиксированная длина, value type;slice- динамический, reference type;struct- набор полей;pointer- указатель;function- функции как значения;interface- набор методов;map- key-value, reference type;channel- для горутин.
Важное различие: value types копируются при присваивании и передаче в функцию; reference types содержат ссылку на underlying data, поэтому изменения видны вызывающему.
Также выделяют:
- named types - объявленные через
type MyInt int; - unnamed types - литералы, например
[]int,struct{ x int }.
На практике
На практике важно понимать:
- Слайсы и мапы передаются по ссылке, но сам заголовок слайса (len, cap, pointer) - по значению. Это частая причина багов.
stringimmutable - конкатенация создаёт новую строку.interface{}(илиany) - пустой интерфейс, может хранить любой тип.- При работе с JSON, БД, сериализацией нужно учитывать zero values:
0,"",nil,false. - Для производительности: большие struct лучше передавать по указателю, но это trade-off с безопасностью (мутабельность).
Пример кода
GOpackage mainimport "fmt"type MyInt int // named typefunc main() {// value typea := [3]int{1, 2, 3}b := ab[0] = 100fmt.Println(a, b) // [1 2 3] [100 2 3]// reference type (slice)s1 := []int{1, 2, 3}s2 := s1s2[0] = 100fmt.Println(s1, s2) // [100 2 3] [100 2 3]// mapm1 := map[string]int{"x": 1}m2 := m1m2["y"] = 2fmt.Println(m1) // map[x:1 y:2]// interfacevar i interface{} = MyInt(42)fmt.Println(i)}
Как отвечать на собеседовании
Начни с краткой классификации, затем переходи к деталям. Обязательно упомяни разницу между value и reference типами - это ключевой момент. Приведи пример из практики, где эта разница вызвала проблему или наоборот помогла. Если спросят про производительность - упомяни аллокации, копирование struct, escape analysis. Не углубляйся в экзотику, пока не попросят.
Что проверяет интервьюер
- Понимание базовой модели типов в Go.
- Знание разницы между value и reference типами.
- Понимание внутреннего устройства slice (header, underlying array).
- Умение объяснить zero values и их роль.
- Способность применить знания на практике (например, в контексте передачи данных между функциями).
Типичные ошибки
- Путаница между array и slice: array - value, slice - reference.
- Утверждение, что все ссылочные типы передаются по ссылке - на самом деле передаётся копия заголовка.
- Забывают про
byteиruneкак алиасы. - Не различают named и unnamed types, что важно для методов и интерфейсов.
- Игнорируют zero values при работе с JSON или БД - это частая причина багов.
> Похожие задачи по backend
Как сохранить большой объем данных клиентов с множеством счетов в оперативной памяти без базы данных?
Как посчитать количество элементов в массиве
Работаете ли вы с Python и Go
Какие гарантии доставки сообщений предоставляет Google Pub/Sub?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью