> Какие категории и типы данных существуют (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:

  1. Булевы - bool (true/false).
  2. Числовые:
    • целые: int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr;
    • с плавающей точкой: float32, float64;
    • комплексные: complex64, complex128;
    • алиасы: byte = uint8, rune = int32.
  3. Строки - string (immutable, UTF-8).
  4. Составные:
    • 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) - по значению. Это частая причина багов.
  • string immutable - конкатенация создаёт новую строку.
  • interface{} (или any) - пустой интерфейс, может хранить любой тип.
  • При работе с JSON, БД, сериализацией нужно учитывать zero values: 0, "", nil, false.
  • Для производительности: большие struct лучше передавать по указателю, но это trade-off с безопасностью (мутабельность).

Пример кода

GO
package main
import "fmt"
type MyInt int // named type
func main() {
// value type
a := [3]int{1, 2, 3}
b := a
b[0] = 100
fmt.Println(a, b) // [1 2 3] [100 2 3]
// reference type (slice)
s1 := []int{1, 2, 3}
s2 := s1
s2[0] = 100
fmt.Println(s1, s2) // [100 2 3] [100 2 3]
// map
m1 := map[string]int{"x": 1}
m2 := m1
m2["y"] = 2
fmt.Println(m1) // map[x:1 y:2]
// interface
var 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 или БД - это частая причина багов.

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

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