参考答案
结论:用sync.WaitGroup等待多协程结束,Add增计数,Done减一,Wait阻塞至零。核心要点:内部noCopy、state1含counter、waiter、信号量;Add原子增counter;Done调Add(-1);Wait原子读counter,>0则waiter++并信号量等待。原理:state1 12字节存counter(32)、waiter(32)、sem(32);Add用atomic更新,变零释放信号量唤醒;Wait用CAS增waiter并runtime_Semacquire阻塞。注意Add在Wait前,负值不超counter。示例:wg.Add(2); go func(){defer wg.Done()}(); wg.Wait()。