← Все навыки

Go. Структуры данных

Указатели, массивы, слайсы, мапы, структуры и интерфейсы — как они устроены в памяти и почему код ведёт себя именно так

6 разделов + практика и разбор вопросов Junior / Middle Индивидуально с ментором

Автор курса — о том, как всё устроено (1 мин)

Для кого этот навык

  • Go-разработчики, которые хотят понимать внутреннее устройство встроенных типов
  • Разработчики, переходящие на Go с другого языка
  • Все, кто готовится к собеседованию и хочет уверенно отвечать про слайсы, мапы и память

Программа

Указатели

Стек, куча, escape analysis и сборщик мусора
  • Объявление указателей, нулевой указатель, указатели на структуры
  • Стек и куча: как Go решает, где разместить данные
  • Escape analysis и проверка решений компилятора
  • Сборщик мусора и время жизни данных
  • Пакет unsafe, unsafe.Pointer, арифметика через uintptr и weak-указатели

Массивы

Фиксированная длина и передача по значению
  • Объявление, инициализация, перебор и сравнение массивов
  • Непрерывный блок памяти, массивы на стеке против кучи
  • Передача по значению и стоимость копирования
  • Многомерные массивы в памяти

Слайсы

Базовый массив, append, реаллокация, утечки
  • Создание слайсов, срезы, append и copy, пакет slices
  • Что такое слайс на самом деле: указатель, длина, ёмкость
  • Общий базовый массив и утечка памяти при срезании
  • Стратегия роста ёмкости и предварительное выделение памяти

Мапы

hmap, бакеты, tophash и порядок итерации
  • Литерал и make, нулевая мапа против пустой, comma-ok и delete
  • Хеширование как основа работы мап и требования к ключу
  • Структура hmap, бакеты, массив tophash
  • Коллизии, рост и эвакуация, почему порядок итерации не гарантирован

Структуры

Методы, receiver'ы и встраивание
  • Определение и инициализация, размер структуры и порядок полей
  • Методы: value receiver против pointer receiver, автоматическая конвертация
  • Вложенные структуры против встраивания (embedding)
  • Множественное встраивание, конфликты имён, затенение полей и методов

Интерфейсы

Неявная реализация и устройство eface/iface
  • Неявная реализация, pointer receiver против value receiver
  • Полиморфизм через интерфейсы, пустой интерфейс и any
  • Устройство eface и iface: поля _type, data, itab и таблица методов
  • Упаковка значения в интерфейс и ловушка nil-интерфейса

Вопросы с собеседований

Разбор вопросов по всем темам курса
  • Вопросы по каждой теме курса с эталонными ответами
  • Формулировки уровня Junior и Middle

Практика

Три задачи с базовой частью и усложнениями — пишете код, приносите на разбор ментору

  • Хранилище событий: добавление, поиск по ID, типу и времени, фильтрация по предикату
  • LRU-кэш: вытеснение, статистика обращений, дополнительные операции
  • Граф связей: двусторонние связи, поиск общих друзей, типизированные связи через интерфейс