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() }