Будет напечатано 2. sub и src используют один underlying array, поэтому sub[0] = 2 меняет и src[0].
Какой вывод получит программа в примере №49
Будет напечатано 2. sub и src используют один underlying array, поэтому sub[0] = 2 меняет и src[0].
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какое значение будет напечатано после выполнения следующего кода на Go:
src := []int{1, 2, 3}
sub := src[:2]
sub[0] = 2
fmt.Println(src[0]) // ?
Ответ
Будет напечатано 2. sub и src используют один underlying array, поэтому sub[0] = 2 меняет и src[0].
Операция src[:2] создаёт новый дескриптор среза, но не копирует элементы. Длина sub равна 2, а адрес начала данных тот же, что у src.
Изменение существующего элемента видно через все срезы, ссылающиеся на него. Для независимого subslice можно сделать sub := append([]int(nil), src[:2]...) либо выделить память через make и выполнить copy. Ограничение capacity само по себе не защищает уже существующие элементы от изменения.