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().