Какой вывод получит программа в примере №49

Будет напечатано 2. sub и src используют один underlying array, поэтому sub[0] = 2 меняет и src[0].

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

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

Будет напечатано 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 само по себе не защищает уже существующие элементы от изменения.

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

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

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

Подробнее