Возможно ли в Go получить переполнение стека (stack overflow)?

Ответ

Да, возможно, хотя это и редкое явление благодаря механизму динамического роста стека в Go.

В отличие от языков с фиксированным размером стека (например, C/C++), Go выделяет для каждой горутины небольшой начальный стек (обычно 2 КБ). Если этого пространства становится недостаточно, Go автоматически выделяет новый, больший сегмент памяти и копирует в него содержимое текущего стека, позволяя ему «расти».

Тем не менее, переполнение стека может произойти в двух основных случаях:

  1. Бесконечная рекурсия: Функция вызывает саму себя без условия завершения.

    func overflow() {
        overflow() // Бесконечная рекурсия
    }
  2. Чрезмерно глубокая рекурсия: Даже при наличии условия выхода, глубина вызовов может превысить максимальный лимит размера стека (например, 1 ГБ для 64-битных систем).

Когда лимит достигается, программа аварийно завершается с ошибкой:

runtime: goroutine stack exceeds 1-GB limit
fatal error: stack overflow

Как этого избежать:

  • Отдавайте предпочтение итеративным алгоритмам вместо глубокой рекурсии.
  • В редких случаях для отладки или специфических задач можно изменить максимальный размер стека с помощью runtime/debug.SetMaxStack, но это не является стандартной практикой.