Какие плюсы и минусы завершения работы горутин по Timeout

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

Ответ

Плюсы:

  1. Контроль выполнения – предотвращает зависание горутин при неожиданных блокировках.
  2. Упрощение логики – не нужно вручную отслеживать завершение через каналы.
  3. Ресурсы – гарантирует освобождение ресурсов (память, соединения) даже при ошибках.

Минусы:

  1. Ложные срабатывания – горутина может завершиться, хотя еще выполняла полезную работу.
  2. Сложность отладки – труднее определить причину таймаута (блокировка vs долгий расчет).
  3. Нет гарантии – горутина может "зависнуть" и не завершиться (например, deadlock).

Пример:

func worker(timeout time.Duration) {
    done := make(chan struct{})
    go func() {
        // Долгая операция
        time.Sleep(2 * timeout) 
        close(done)
    }()

    select {
    case <-done:
        fmt.Println("Успешно завершено")
    case <-time.After(timeout):
        fmt.Println("Таймаут")
    }
}