使用 fhEVM 构建密封式 NFT 盲拍:全同态加密链上保密拍卖实战指南
2026/9/12 13:00:40
在Go语言中,sync.WaitGroup(简称WaitGroup)是用于多goroutine同步的核心机制,但其使用需谨慎,否则可能导致程序卡顿、死锁或数据竞争等问题。以下是关键踩坑点及解决方案:
varwg sync.WaitGroup wg.Add(1)gofunc(){deferwg.Done()// 子任务逻辑}()wg.Wait()// 主线程等待子任务完成wg.Add(1)// 增加计数器gofunc(){deferwg.Done()// 任务结束时减少计数器// 任务逻辑}()fori:=0;i<5;i++{wg.Add(1)gofunc(numint){// 传递参数deferwg.Done()fmt.Println("Goroutine",num)}(i)// 传递当前i值}funcworker(wg*sync.WaitGroup){deferwg.Done()// 任务逻辑}wg.Add(1)worker(&wg)// 传递指针gofunc(){deferwg.Done()// 确保Done()在return前执行// 任务逻辑}()ctx,cancel:=context.WithTimeout(context.Background(),1*time.Second)defercancel()gofunc(ctx context.Context){select{case<-ctx.Done():return// 超时退出case<-time.After(2*time.Second):// 任务逻辑}}(ctx)示例代码
varwg sync.WaitGroup wg.Add(1)gofunc(){deferwg.Done()time.Sleep(1*time.Second)fmt.Println("Task completed")}()wg.Wait()// 等待任务完成WaitGroup是Go并发编程的基石,但需严格遵循计数器操作顺序和闭包变量传递规则,避免常见陷阱。