WaitGroup 是 Go 語言的一個并發控制機制,它可以用于等待一組 goroutine 的結束。WaitGroup 提供了三個方法:Add、Done 和 Wait。
Add 方法:用于設置 WaitGroup 中等待的 goroutine 的數量。Add 方法的參數是一個整數,表示需要等待的 goroutine 的數量。通常在啟動每個 goroutine 之前都會調用 Add 方法來增加要等待的 goroutine 的數量。
Done 方法:用于通知 WaitGroup 一個 goroutine 的結束。在 goroutine 的最后調用 Done 方法來減少 WaitGroup 中等待的 goroutine 的數量。
Wait 方法:用于阻塞當前 goroutine,直到 WaitGroup 中等待的 goroutine 的數量變為 0。一般在主 goroutine 里調用 Wait 方法,等待所有子 goroutine 結束后再繼續執行。
下面是一個使用 WaitGroup 的示例代碼:
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
fmt.Printf("goroutine %d\n", i)
}(i)
}
wg.Wait()
fmt.Println("All goroutines finished")
}
在上面的例子中,首先創建了一個 WaitGroup 對象 wg。然后使用一個 for 循環啟動了 5 個 goroutine,并在每個 goroutine 中調用了 wg.Add(1) 來增加 WaitGroup 中等待的 goroutine 的數量。在每個 goroutine 的最后調用了 wg.Done() 來通知 WaitGroup 一個 goroutine 的結束。最后在主 goroutine 中調用了 wg.Wait() 來等待所有的子 goroutine 結束。
上面的代碼運行時,可能會輸出類似如下的結果:
goroutine 4
goroutine 0
goroutine 3
goroutine 2
goroutine 1
All goroutines finished
可以看到,不同的 goroutine 的輸出順序是隨機的,這是因為它們是并發執行的。
總結:WaitGroup 是 Go 語言中一個用于等待一組 goroutine 結束的機制。通過調用 Add、Done 和 Wait 方法,可以實現對一組 goroutine 的并發控制。