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