func cc() {
c := make(chan struct{}, 2) // 带缓冲区的channel
var wg sync.WaitGroup
wg.Add(10)
for i := 0; i < 10; i++ {
go func(i int) {
defer func() {
if err := recover(); err != nil {
fmt.Println("err", err)
debug.PrintStack()
}
}()
c <- struct{}{} // 往channel中添加
defer wg.Done() // 完成一个wg
defer func() {
fmt.Println("goroutine: ", i)
<-c // 无论是否有painc都消费一个channel
}()
if i == 3 {
panic("*********** panic ***********")
}
time.Sleep(10 * time.Millisecond)
if i == 3 {
fmt.Println("####### 3 ######")
}
}(i)
fmt.Println("for i :", i)
}
wg.Wait()
}