В чем разница выделения памяти в стеке и куче

«В чем разница выделения памяти в стеке и куче» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go память в стеке выделяется для локальных переменных функций и автоматически освобождается при выходе из функции. Это быстро, но ограничено по размеру.

Память в куче выделяется для данных, которые должны жить дольше функции (например, при использовании new, make или возврате указателя). Управление кучей сложнее, требует сборщика мусора (GC).

Пример:

func stackAlloc() int {
    x := 42  // выделяется в стеке
    return x
}

func heapAlloc() *int {
    x := new(int)  // выделяется в куче
    *x = 42
    return x  // указатель переживает функцию
}

Нюансы:

  • Стек быстрее, но мал.
  • Куча медленнее, но гибче.
  • Go старается аллоцировать в стек, когда возможно (escape analysis).