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