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