Back to questions
Senior
3
Будет ли массив res на стеке или на куче, учитывая, что он передаётся в функции double и append?
Companies where asked
А7
Answer from AI
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) // возможно выделение новой памяти в куче
}
Итого: массивы передаются по значению, копируются на стек вызывающей функции. Срезы — это структуры с указателем на данные в куче.