channel 可以让多个goroutine 之间实现通信
Add方法调用时机:必须在goroutine 启动之前调用Add方法来增加计数器的值。
如果在goroutine已经启动之后再调用Add,可能会导致Wait方法提前返回,因为计数器没有正确反映正在运行的goroutine的数量。把握住:Add()与Wait()保证在同一个函数中
【golang】 WaitGroup使用注意事项_golang sync.waitgroup使用的坑-CSDN博客
package mainimport ("fmt""sync"
)// 声明全局等待组变量
var wg sync.WaitGroupfunc hello() {fmt.Println("hello")wg.Done() // 告知当前goroutine完成
}func main() {wg.Add(1) // 登记1个goroutinego hello()fmt.Println("你好")wg.Wait() // 阻塞等待登记的goroutine完成
}
这里定义 wg.add(1000) 这里是事先 先定义好
如果是在 go func(i int) 里面 就应该是 wg.add(1) ,意思每次循环加1
下面这个实例也是 匿名函数的 goroutine 使用《错误实例》
Add方法调用时机:必须在goroutine 启动之 // 前调用Add方法来增加计数器的值
var wg sync.WaitGroup// 错误示例,在goroutine启动后才调用Add// 应该在这里调用 :wg.Add(1)go func() {wg.Add(1) // 这个是错误实例 wg.Add(1) Add方法调用时机:必须在goroutine 启动之 // 前调用Add方法来增加计数器的值fmt.Println("Goroutine is running")wg.Done()}()wg.Wait()
package mainimport ("fmt""sync")func worker(wg *sync.WaitGroup) {defer wg.Done()fmt.Println("Worker is running")}func main() {var wg sync.WaitGroupwg.Add(1)// 传递指针worker(&wg)wg.Wait()}