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