Ответ
В Go память в стеке выделяется для локальных переменных функций и автоматически освобождается при выходе из функции. Это быстро, но ограничено по размеру.
Память в куче выделяется для данных, которые должны жить дольше функции (например, при использовании new, make или возврате указателя). Управление кучей сложнее, требует сборщика мусора (GC).
Пример:
func stackAlloc() int {
x := 42 // выделяется в стеке
return x
}
func heapAlloc() *int {
x := new(int) // выделяется в куче
*x = 42
return x // указатель переживает функцию
}
Нюансы:
- Стек быстрее, но мал.
- Куча медленнее, но гибче.
- Go старается аллоцировать в стек, когда возможно (escape analysis).