交替打印

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

func main() {
    var ch = make(chan int, 0)

    wg.Add(1)
    go func() {
        defer wg.Done()
        for {
            var a, ok = <-ch
            if !ok {
                return
            }
            fmt.Println("A协程", a)
            a += 1
            if a == 101 {
                close(ch)
                return
            }
            ch <- a
        }
    }()

    wg.Add(1)
    go func() {
        ch <- 1
        defer wg.Done()
        for {
            var a, ok = <-ch
            if !ok {
                return
            }
            fmt.Println("B协程", a)
            a += 1
            if a == 101 {
                close(ch)
                break
            }
            ch <- a
        }
    }()

    wg.Wait()
}
package main

import (
    "fmt"
    "sync"
)

func main() {
    var (
        a  = make(chan struct{}, 1)
        wg sync.WaitGroup
    )
    a <- struct{}{}
    wg.Add(1)
    go func() {
        defer wg.Done()
        for i := 1; i <= 100; i++ {
            _, ok := <-a
            if !ok {
                return
            }
            if i&1 == 0 {
                fmt.Println(i)
            }
            if i >= 100 {
                close(a)
                return
            }
            a <- struct{}{}
        }
    }()

    wg.Add(1)
    go func() {
        defer wg.Done()
        for i := 1; i <= 100; i++ {
            _, ok := <-a
            if !ok {
                return
            }
            if i&1 == 1 {
                fmt.Println(i)
            }
            a <- struct{}{}
        }
    }()

    wg.Wait()
}

最后更新于

这有帮助吗?