channel 可以让多个goroutine 之间实现通信
Add方法调用时机:必须在goroutine 启动之前调用Add方法来增加计数器的值。
如果在goroutine已经启动之后再调用Add,可能会导致Wait方法提前返回,因为计数器没有正确反映正在运行的goroutine的数量。把握住:Add()与Wait()保证在同一个函数中
【golang】 WaitGroup使用注意事项_golang sync.waitgroup使用的坑-CSDN博客
package main
import (
"fmt"
"sync"
)
// 声明全局等待组变量
var wg sync.WaitGroup
func hello() {
fmt.Println("hello")
wg.Done() // 告知当前goroutine完成
}
func main() {
wg.Add(1) // 登记1个goroutine
go 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 main
import (
"fmt"
"sync"
)
func worker(wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println("Worker is running")
}
func main() {
var wg sync.WaitGroup
wg.Add(1)
// 传递指针
worker(&wg)
wg.Wait()
}