Go交叉打印

package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup
var number, letter = make(chan bool, 1), make(chan bool, 1)

func printInt() {
	defer wg.Done()
	i := 1
	for {
		_, ok := <-number
		if !ok {
			close(letter)
			return
		}
		fmt.Printf("%d%d", i, i+1)
		i += 2
		letter <- true
	}
}

func printLetter() {
	defer wg.Done()
	l := 'A'

	for {
		_, _ = <-letter
		if l > 'Z' {
			close(number)
			return
		}
		fmt.Printf("%c%c", l, l+1)
		l += 2
		number <- true
	}
}

func AllInOne() {
	defer wg.Done()
	var i = 1
	var l = 'A'
	for {
		select {
		case _, ok := <-number:
			if i > 28 || !ok {
				close(letter)
				return
			}

			fmt.Printf("%d%d", i, i+1)
			i += 2
			letter <- true
		case _, ok := <-letter:
			if !ok || l > 'Z' {
				close(number)
				return
			}
			fmt.Printf("%c%c", l, l+1)
			l += 2
			number <- true
		default:

		}
	}
}

func main() {
	wg.Add(1)
	go AllInOne()
	// go printInt()
	// go printLetter()
	number <- true
	wg.Wait()
}

posted @ 2023-03-09 21:03  liy36  阅读(45)  评论(0)    收藏  举报