Поведение при копировании и расширении среза

newArr сначала имеет len=1 и cap=2. После добавления 2 его len=2, cap=2; после добавления 3 нужен новый массив с cap не меньше 3. arr сохраняет длину 1.

Короткий ответ

Что ответить на собеседовании

newArr сначала имеет len=1 и cap=2. После добавления 2 его len=2, cap=2; после добавления 3 нужен новый массив с cap не меньше 3. arr сохраняет длину 1.

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

Ответ с пояснениями

Условие

В примере сначала создаётся срез arr через make, затем формируется второй срез newArr как полное срезание arr[:]. После этого к newArr последовательно добавляются элементы при помощи append. Нужно определить, как изменятся длина и ёмкость newArr после каждой операции и как эти изменения отразятся на исходном срезе arr.

arr := make([]int, 0, 2)        // len 0, cap 2
arr = append(arr, 1)            // len 1, cap 2

newArr := arr[:]                // len = 1, cap = ?
newArr = append(newArr, 2)      // что будет с исходным?
newArr = append(newArr, 3)      // что будет с исходным?

Ответ

newArr сначала имеет len=1 и cap=2. После добавления 2 его len=2, cap=2; после добавления 3 нужен новый массив с cap не меньше 3. arr сохраняет длину 1.

Первый append записывает двойку в общий массив: её можно увидеть через arr[:2], но не в обычном выводе arr. Второй append копирует данные в новый массив и уже не затрагивает прежний. Точную новую capacity язык не фиксирует, поэтому нельзя безусловно обещать 4 для любой реализации и типа.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее