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 для любой реализации и типа.