Sobes.tech
Back to questions
Senior
4

```go func fail() { panic("Fail!") } func main() { fmt.Println("Start!") var wg sync.WaitGroup wg.Add(1) go func() { defer func() { if e := recover(); e != nil { fmt.Println(e) } }() fail() wg.Done() }() wg.Wait() fmt.Println("Finish!") } ```

Companies where asked
Wildberries & Russ Bank

Answer from AI

sobes.tech AI

В данном коде есть ошибка в порядке вызова wg.Done(). В горутине wg.Done() вызывается после fail(), которая вызывает panic. Из-за этого wg.Done() никогда не выполнится, и wg.Wait() в main заблокируется навсегда.

Чтобы исправить ситуацию, нужно вызвать wg.Done() в defer, чтобы гарантировать его выполнение даже при панике:

var wg sync.WaitGroup
wg.Add(1)
go func() {
    defer wg.Done() // гарантируем вызов
    defer func() {
        if e := recover(); e != nil {
            fmt.Println(e)
        }
    }()

    fail() // вызовет panic
}()
wg.Wait()

Таким образом, wg.Done() сработает, wg.Wait() разблокируется, и программа корректно завершится, выведя "Fail!" и "Finish!". В исходном варианте программа зависнет на wg.Wait().