Оба вызова 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 данные копируют явно.