Как append меняет оригинальный срез

Оба Println покажут [1 2 4]: append использует свободную вместимость sub и заменяет третий элемент общего массива src.

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

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

Оба Println покажут [1 2 4]: append использует свободную вместимость sub и заменяет третий элемент общего массива src.

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

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

Условие

Необходимо определить, какие значения будут выведены в консоль после того, как к срезу, полученному из другого среза, применяется функция append.

func example() {
    src := []int{1, 2, 3}

    sub := src[:2]
    sub = append(sub, 4)

    fmt.Println(sub) // 1,2,4
    fmt.Println(src) // 1,2,4
}

Ответ

Оба Println покажут [1 2 4]: append использует свободную вместимость sub и заменяет третий элемент общего массива src.

sub = src[:2] имеет длину 2 и вместимость 3. Добавление одного элемента помещается в существующий массив, поэтому число 3 заменяется на 4.

Если требуется не затрагивать хвост src, создайте sub := src[:2:2]: append будет вынужден выделить новый массив. Это не изолирует запись в уже существующие sub[0] и sub[1]; для полной независимости элементов необходима копия. Объявленную функцию example также нужно вызвать, чтобы получить вывод.

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

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

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

Подробнее