Вывод результатов append и совместное использование памяти в слайсах

При обычной capacity=4 после первых четырёх append вывод будет [0 1 2 3 4] [0 1 2 3 5]. Каждый следующий append тогда выделяет отдельный массив.

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

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

При обычной capacity=4 после первых четырёх append вывод будет [0 1 2 3 4] [0 1 2 3 5]. Каждый следующий append тогда выделяет отдельный массив.

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

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

Условие

Определите, какие значения будут напечатаны функцией fmt.Println, учитывая особенности работы функции append и то, как слайсы используют общую область памяти.

func a() {
  x := []int{}
  x = append(x, 0)
  x = append(x, 1)
  x = append(x, 2)
  x = append(x, 3)
  y := append(x, 4)
  z := append(x, 5)
  fmt.Println(y, z)
}

func main() {
  a()
}

Ответ

При обычной capacity=4 после первых четырёх append вывод будет [0 1 2 3 4] [0 1 2 3 5]. Каждый следующий append тогда выделяет отдельный массив.

Точный рост capacity не гарантируется языком. Если у x после четырёх элементов ещё осталось место, оба append используют общий массив, и z перезапишет последнюю позицию y: обе строки закончатся на 5. Чтобы гарантировать независимые результаты, перед добавлением копируйте x либо ограничьте capacity срезом x[:len(x):len(x)].

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

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

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

Подробнее