При обычной вместимости src = 4 вывод будет [1 2 3] [1 2 3 5] [1 2 3 5]: два append перезаписывают одну общую ячейку.
Как 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 всегда печатается в пределах прежних трёх элементов.