Sobes.tech
Назад к вопросам
Senior
2

Будет ли массив res на стеке или на куче, учитывая, что он передаётся в функции double и append?

Компании, где спрашивали
А7

Ответ от нейросети

sobes.tech AI

В Go массивы — это значения фиксированного размера, и они обычно располагаются там, где объявлены. Если массив объявлен в функции, он будет размещён на стеке. При передаче массива в функцию происходит копирование всего массива (копия значения), то есть создаётся новый массив на стеке вызываемой функции.

Если же передавать срез (slice), то передаётся структура с указателем на данные в куче, длиной и ёмкостью, а сами данные могут находиться в куче.

Пример:

func double(arr [3]int) {
    for i := range arr {
        arr[i] *= 2
    }
}

func append(arr []int, val int) []int {
    return append(arr, val)
}

func main() {
    res := [3]int{1, 2, 3} // массив на стеке main
    double(res)             // копия массива на стеке double

    slice := []int{1, 2, 3} // срез, данные в куче
    slice = append(slice, 4) // возможно выделение новой памяти в куче
}

Итого: массивы передаются по значению, копируются на стек вызывающей функции. Срезы — это структуры с указателем на данные в куче.