package main

import (
	"fmt"
	"sync"
)

func main() {
	odd := make(chan struct{})  // 奇数 goroutine 的令牌
	even := make(chan struct{}) // 偶数 goroutine 的令牌
	done := make(chan struct{}) // 用来通知主函数结束
	var wg sync.WaitGroup

	wg.Add(2)

	// 打印奇数：1,3,5,7,9
	go func() {
		defer wg.Done()
		for i := 1; i <= 10; i += 2 {
			<-odd // 等令牌
			fmt.Println(i)
			if i == 9 { // 最后一个奇数，不再发令牌
				close(done)
				return
			}
			even <- struct{}{} // 把令牌给偶数 goroutine
		}
	}()

	// 打印偶数：2,4,6,8,10
	go func() {
		defer wg.Done()
		for i := 2; i <= 10; i += 2 {
			<-even // 等令牌
			fmt.Println(i)
			if i == 10 { // 打印完 10，直接退出
				return
			}
			odd <- struct{}{} // 把令牌还给奇数 goroutine
		}
	}()

	// 主 goroutine 先把令牌给 odd，启动交替流程
	odd <- struct{}{}

	// 等结束信号
	<-done
	wg.Wait()
}
