Этап 2 из 7 · ≈ 6 ч

Срезы, мапы и строки

Основа с Junior

Устройство среза, append и общий массив, мапы, строки и руны.

Что важно знать

  • Срез — указатель, длина, ёмкость.
  • append может вернуть новый массив — результат обязательно присваивать.
  • Порядок обхода мапы случаен; мапа не потокобезопасна.
  • Строка — байты, руна — символ Unicode.

Критерии освоения

Junior ≈ 6 ч

  • Объясняет len и cap среза и рост при append
  • Объясняет, почему срезы могут делить общий массив

Практика. Решить 10 задач «что выведет код» на срезы и append.

Middle ≈ 4 ч

  • Избегает ловушек — изменение через подсрез, итерация по мапе, строки как байты

Практика. Найти и исправить ошибки с общим массивом в учебном коде обработки срезов.

Проверка знаний

Войдите, чтобы пройти тест: сданный тест отмечает тему пройденной на карте и в ИПР.

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

Смотреть все
Почему изменение одного среза неожиданно меняет другой?Junior

Срезы, полученные друг из друга, делят базовый массив, пока append не перевыделил его. Если у исходного среза есть свободная ёмкость, append к подсрезу перезапишет элементы исходного. Поведение зависит от cap — поэтому баг проявляется не всегда.

Полный разбор
Чем массив отличается от среза в Go?Junior

Массив [5]int — значение фиксированного размера, размер — часть типа ([3]int и [4]int — разные типы); присваивание и передача копируют все элементы. Срез []int — дескриптор над массивом с переменной длиной; копирование дешёвое, данные общие.

Полный разбор
Чем make отличается от new в Go?Junior

new(T) выделяет нулевое значение любого типа и возвращает указатель T. make — только для срезов, мап и каналов: инициализирует их внутреннюю структуру и возвращает само значение (не указатель), готовое к работе.

Полный разбор
Как устроена map в Go и какие у неё особенности?Junior

map — хеш-таблица: вставка, поиск и удаление в среднем O(1). Порядок обхода случаен и намеренно перемешивается от запуска к запуску. Конкурентная запись из нескольких горутин — фатальная ошибка «concurrent map writes»: нужен Mutex или sync.Map.

Полный разбор
Чем nil-срез отличается от пустого и почему запись в nil-map вызывает panic?Junior

nil-срез (var s []int) и пустой ([]int{}) оба имеют len 0, с обоими работают range и append. Различие — только s == nil и JSON: nil кодируется как null, пустой — как []. nil-map можно читать (нулевое значение), но запись — panic: у неё нет хеш-таблицы, куда…

Полный разбор
Как устроен срез (slice) в Go?Junior

Срез — дескриптор из трёх полей: указатель на базовый массив, длина (len — сколько элементов доступно) и ёмкость (cap — сколько поместится до конца массива). append пишет в тот же массив, пока хватает ёмкости; иначе выделяет новый массив большего размера и…

Полный разбор
Как в Go устроены строки, байты и руны?Junior

Строка — неизменяемая последовательность байт, обычно в UTF-8. len возвращает число байт, а не символов: кириллица занимает 2 байта, поэтому len("привет") == 12. Руна (rune = int32) — код символа Unicode. for range по строке идёт по рунам, индекс s[i] — по…

Полный разбор

← Вся карта «Go»

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования