WaitGroup + 無緩沖channel
- waitgroup 用來控制2個協程
-
- Add() 、Done()、Wait()
- channel用來實現信號的傳遞和信號的打印
-
- ch1: 用來記錄打印的信號
-
- ch2:用來實現信號的傳遞,實現2個協程的順序打印
package mainimport ("fmt""sync"
)func main() {var wg sync.WaitGroup // 創建一個 WaitGroup 用于2個 goroutine 執行完成ch1 := make(chan int) // 創建一個無緩沖的整數通道 ch1ch2 := make(chan int) // 創建一個無緩沖的整數通道 ch2wg.Add(2) // 向 WaitGroup 中添加 2 個需要等待的 goroutine// 啟動第一個 goroutinego func() {defer wg.Done() // 當 goroutine 結束時,調用 Done 通知 WaitGroup 完成// 從 1 開始,每次加 2 向 ch1 發送數據for i := 1; i <= 100; i += 2 {ch1 <- i // 打印發送的奇數fmt.Println("Goroutine 1:", i)<-ch2 // 等待 ch2信號,阻塞}close(ch1) // 關閉 ch1 通道}()// 啟動第二個 goroutinego func() {defer wg.Done() // 當 goroutine 結束時,調用 Done 通知 WaitGroup 完成// 從 ch1 中接收數據for i := range ch1 {// 打印接收的奇數加 1 的結果fmt.Println("Goroutine 2:", i+1)ch2 <- i // 向 ch2 發送數據}close(ch2) // 關閉 ch2 通道}()// 等待兩個 goroutine 完成wg.Wait()
}