Вопрос проверяет понимание типичных ошибок и плохих практик при завершении программы в Go.
Антипаттерны включают: использование os.Exit в середине логики, панику без восстановления (recover), игнорирование ошибок и отсутствие обработки сигналов завершения. Они усложняют тестирование, читаемость и устойчивость программы.
В Go аварийное завершение программы может быть необходимым, но часто применяется неправильно.
os.Exit без логирования или очистки:
Завершает программу немедленно, не вызывая defer.
Не освобождаются ресурсы, не сохраняется состояние.
Плохо подходит для библиотек.
panic без recover:
Использование паники вместо ошибок нарушает управление потоком.
Пример:
panic("не могу продолжить")Игнорирование ошибок:
Часто встречается в виде _ = doSomething().
Ошибки нужно обрабатывать явно.
Отсутствие обработки системных сигналов (os.Signal):
Приложение не может корректно завершиться при SIGINT/SIGTERM.
Переиспользование panic в логике ошибок:
Это нарушает ожидаемое поведение и делает программу непредсказуемой.
Обработка ошибок через error.
Использование defer для очистки.
Обработка сигналов через signal.Notify.
Контекстное завершение (context.Context).
Вывод:
Избегайте паники и прямого выхода без очистки. Используйте стандартные механизмы ошибок и управления контекстом.