Как append изменяет базовый срез и полученные копии

При обычной вместимости src = 4 вывод будет [1 2 3] [1 2 3 5] [1 2 3 5]: два append перезаписывают одну общую ячейку.

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

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

При обычной вместимости src = 4 вывод будет [1 2 3] [1 2 3 5] [1 2 3 5]: два append перезаписывают одну общую ячейку.

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

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

Условие

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

package main

import "fmt"

func main() {
    src := make([]int, 0)
    src = append(src, 1)
    src = append(src, 2)
    src = append(src, 3)
    first := append(src, 4)
    second := append(src, 5)
    fmt.Printf("%v %v %v", src, first, second)
}

Ответ

При обычной вместимости src = 4 вывод будет [1 2 3] [1 2 3 5] [1 2 3 5]: два append перезаписывают одну общую ячейку.

Длина src после трёх добавлений равна 3. Если его вместимость больше 3, first и second используют один массив и второе добавление меняет элемент с индексом 3 на 5.

Рост capacity не закреплён спецификацией. Если вместимость равна 3, каждый append выделит независимый массив и first останется [1 2 3 4]. Для детерминированного разделения используйте src[:len(src):len(src)] перед append или копируйте данные явно. Сам src всегда печатается в пределах прежних трёх элементов.

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

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

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

Подробнее