Ответ
Данные в heap живут до тех пор, пока на них есть хотя бы одна активная ссылка. В Go сборщик мусора (GC) автоматически освобождает память, когда объекты больше не достижимы из корневых указателей (глобальные переменные, стек вызовов, регистры).
Пример:
func createObject() *int {
x := 42 // выделяется в heap (escape analysis)
return &x // ссылка сохраняется
}
func main() {
p := createObject()
// объект живет, пока p ссылается на него
p = nil // теперь объект может быть собран GC
}
Нюансы:
- GC работает не мгновенно, а по мере необходимости
- Время жизни может быть продлено неочевидными ссылками (например, в замыканиях)
- Можно влиять на GC через runtime.GC() или debug.SetGCPercent()