Как защитить горутину от зависания

«Как защитить горутину от зависания» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Используйте контекст (context.Context) для отмены долгих операций и таймауты. Пример:

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

go func() {
    select {
    case <-ctx.Done():
        fmt.Println("Timeout exceeded")
        return
    case result := <-longRunningOperation():
        fmt.Println("Result:", result)
    }
}()

Ключевые моменты:

  1. context.WithTimeout устанавливает лимит времени
  2. ctx.Done() сигнализирует о завершении
  3. Обязательно вызывайте cancel() через defer

Для критичных операций можно добавить recover() в горутину:

go func() {
    defer func() {
        if r := recover(); r != nil {
            log.Println("Recovered:", r)
        }
    }()
    // опасный код
}()