package main import ( "fmt" "sync" "time" ) func main(){ //var lock sync.Mutex var wg sync.WaitGroup for i := 1; i <= 3; i++ { //fmt.Println("---------",i) wg.Add(1) // 在每次启动一个新的goroutine前增加WaitGroup计数器 go func(iCopy int) { //lock.Lock() // 获取锁,确保同一时间只有一个goroutine能执行打印操作。解决多个协程访问共享资源 for j := 1; j <= 5; j++ { time.Sleep(time.Second * time.Duration(3)) fmt.Println(j) } //lock.Unlock() // 完成临界区操作后释放锁,允许其他goroutine继续执行。 defer wg.Done() //当goroutine结束其任务时,调用Done方法减少WaitGroup计数器 }(i) // 将循环变量i的当前值复制给iCopy } defer wg.Wait() //调用wg.Wait()会阻塞主goroutine,直到WaitGroup计数器变为0,意味着所有已添加的任务都已经Done()。 }