Go 带有两个goroutine的乒乓球

示例

package main

import (
    "fmt"
    "time"
)

// ping程序打印ping并等待乒乓球
func pinger(pinger <-chan int, ponger chan<- int) {
    for {
        <-pinger
        fmt.Println("ping")
        time.Sleep(time.Second)
        ponger <- 1
    }
}

// ponger打印一个pong,然后等待ping
func ponger(pinger chan<- int, ponger <-chan int) {
    for {
        <-ponger
        fmt.Println("pong")
        time.Sleep(time.Second)
        pinger <- 1
    }
}

func main() {
    ping := make(chan int)
    pong := make(chan int)

    go pinger(ping, pong)
    go ponger(ping, pong)

    // 主goroutine通过发送到ping通道来启动ping / pong
    ping <- 1

    for {
        // 阻塞主线程直到中断
        time.Sleep(time.Second)
    }
}

在Go Playground中运行此代码的稍作修改的版本