实现循环顺序交替打印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完成。

posted @ 2025-03-11 19:31  搁浅~浅浅浅  阅读(37)  评论(0)    收藏  举报