实现循环顺序交替打印123
实现循环顺序交替打印123
方法一、
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
a := make(chan int, 1)
b := make(chan int, 1)
c := make(chan int, 1)
a <- 1
wg.Add(3)
go func() {
defer wg.Done()
for i := 1; i <= 100; i++ {
if _, ok := <-a; ok {
fmt.Printf("%v:1\n", i)
}
b <- 1
}
}()
go func() {
defer wg.Done()
for i := 1; i <= 100; i++ {
if _, ok := <-b; ok {
fmt.Printf("%v:2\n", i)
}
c <- 1
}
}()
go func() {
defer wg.Done()
for i := 1; i <= 100; i++ {
if _, ok := <-c; ok {
fmt.Printf("%v:3\n", i)
}
a <- 1
}
}()
wg.Wait()
fmt.Println("输出完成")
}
注释:
通过三个goroutine和三个通道实现了一个循环打印的逻辑。每个goroutine从一个通道读取数据并打印,然后向下一个通道发送信号。具体步骤如下:
初始化WaitGroup和三个缓冲通道。
启动三个goroutine,每个goroutine负责从一个通道读取并打印,再向下一个通道发送信号。
主线程等待所有goroutine完成。
方法二、
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
a := make(chan int, 1)
b := make(chan int, 1)
c := make(chan int, 1)
wg.Add(3)
a <- 1
go func() {
defer wg.Done()
for i := 1; i <= 100; i++ {
select {
case <-a:
fmt.Printf("%v:1\n", i)
}
b <- 1
}
}()
go func() {
defer wg.Done()
for i := 1; i <= 100; i++ {
select {
case <-b:
fmt.Printf("%v:2\n", i)
}
c <- 1
}
}()
go func() {
defer wg.Done()
for i := 1; i <= 100; i++ {
select {
case <-c:
fmt.Printf("%v:3\n", i)
}
a <- 1
}
}()
wg.Wait()
fmt.Println("输出完成")
}
注释:
通过三个goroutine和三个带缓冲的channel实现了一个循环打印任务。每个goroutine负责从一个channel接收数据并打印,然后向下一个channel发送信号。具体如下:
主线程初始化WaitGroup和channel,并启动三个goroutine。
每个goroutine在一个for循环中等待接收channel信号,打印信息后向下一个channel发送信号。
最终主线程等待所有goroutine完成。

浙公网安备 33010602011771号