Что напечатает программа при передаче среза в функцию

Оба вызова fmt.Println выведут [5 5 5 5]: функция меняет элементы общего массива, а не только локальный дескриптор среза.

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

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

Оба вызова fmt.Println выведут [5 5 5 5]: функция меняет элементы общего массива, а не только локальный дескриптор среза.

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

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

Условие

Определите, какой вывод будет у следующей Go‑программы. В функции modify происходит обход переданного среза и замена всех его элементов на значение 5. После этого срез выводится на экран. В main создаётся исходный срез src, он передаётся в modify, а затем выводится ещё раз.

package main

import (
    "fmt"
)

func modify(arr []int) {
    // arr = append(arr, 125)

    for i := range arr {
        arr[i] = 5
    }

    fmt.Println(arr)
}

func main() {
    src := []int{1, 2, 3, 4}
    modify(src)
    fmt.Println(src)
}

Какой будет результат выполнения программы?

Ответ

Оба вызова fmt.Println выведут [5 5 5 5]: функция меняет элементы общего массива, а не только локальный дескриптор среза.

При передаче src копируется дескриптор, но данные не копируются. Поэтому присваивания arr[i] = 5 видны и через src в main.

Закомментированный append в текущем выводе не участвует. Если его включить, вместимости исходного литерала не хватит для пятого элемента: появится новый массив, и последующие изменения arr не затронут src. Для независимой обработки без зависимости от capacity данные копируют явно.

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

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

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

Подробнее