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()}