Жизненный цикл компонентов в Go по-взрослому Когда в приложении три сервиса — можно вручную стартовать их в main(), закрыть через defer, и всё будет «работать».А потом начинается боль: кто должен стартовать первым? Как убедиться, что компонент реально готов? Как корректно всё гасить при падении?Знакомьтесь — GOscade, библиотека для автоматического старта, остановки и координации зависимостей в Go.🧩 Что делает GOscade:• Компоненты запускаются по цепочке: сначала зависимости, потом — всё остальное• Готовность проверяется через readinessProbe(nil) — если не готов, зависящие компоненты не стартуют.• Остановка — тоже по графу: если кто-то падает, все связанные корректно завершаются• Всё управляется через контектс — понятно, прозрачно, канонично по-Go-шному.Как это выглядит в коде:func (s *Server) Run(ctx context.Context, ready func(error)) error { go func() { err := checkPort(s.Addr) ready(err) }() if err := s.ListenAndServe(); err != nil { return err } <-ctx.Done() return s.Shutdown(context.Background())}Всё просто. Главное — сигнализировать о готовности и уметь завершаться по ctx. Репозиторий проекта Подробнее про проектБиблиотека Go-разработчика #буст