go语言两个协程goroutine交替打印1-100
go语言两个协程goroutine交替打印1-100
该程序使用了 sync.WaitGroup 来协调两个 goroutine 的执行。
首先创建了两个无缓冲的通道 ch1 和 ch2 ,并将 WaitGroup 的计数器设置为 2,表示需要等待两个 goroutine 完成。
第一个 goroutine 从 1 开始,每次加 2 生成奇数,将奇数发送到 ch1 并打印,然后等待从 ch2 接收数据,接收数据后继续下一次迭代,当完成 1 到 100 的奇数发送后,关闭 ch1 通道。
第二个 goroutine 从 ch1 中接收数据,打印接收到的数据加 1 的结果,并将接收到的数据发送到 ch2 ,当 ch1 关闭且数据全部接收完后,关闭 ch2 通道。
wg.Wait() 会阻塞主函数,直到两个 goroutine 都调用 wg.Done() 通知 WaitGroup 完成。
package main
import (
"fmt"
"sync"
)
func main() {
// 创建一个 WaitGroup 用于等待多个 goroutine 完成
var wg sync.WaitGroup
// 创建一个无缓冲的整数通道 ch1
ch1 := make(chan int)
// 创建一个无缓冲的整数通道 ch2
ch2 := make(chan int)
// 向 WaitGroup 中添加 2 个需要等待的 goroutine
wg.Add(2)
// 启动第一个 goroutine
go func() {
// 当 goroutine 结束时,调用 Done 通知 WaitGroup 完成
defer wg.Done()
// 从 1 开始,每次加 2 向 ch1 发送奇数
for i := 1; i <= 100; i += 2 {
ch1 <- i
// 打印发送的奇数
fmt.Println("Goroutine 1:", i)
// 等待 ch2 发送数据
<-ch2
}
// 关闭 ch1 通道
close(ch1)
}()
// 启动第二个 goroutine
go func() {
// 当 goroutine 结束时,调用 Done 通知 WaitGroup 完成
defer wg.Done()
// 从 ch1 中接收数据
for i := range ch1 {
// 打印接收的奇数加 1 的结果
fmt.Println("Goroutine 2:", i+1)
// 向 ch2 发送数据
ch2 <- i
}
// 关闭 ch2 通道
close(ch2)
}()
// 等待两个 goroutine 完成
wg.Wait()
}