一个用Golang通道的乒乓球例子

271 阅读1分钟

在这个例子中,我们将创建一个带有 "缓冲 "通道的 "乒乓 "游戏。将会有两个goroutine专门用于每秒无限次地击球和打球。通道是用来在goroutines之间进行通信的,所以在这种情况下,两个goroutines一旦打到球就会通知对方。

例子1

package main

import (
	"fmt"
	"time"
)

func main() {
	ping := make(chan struct{}, 1)
	pong := make(chan struct{}, 1)

	ping<- struct{}{}

	go play(ping, pong)

	time.Sleep(time.Millisecond)
}

func play(ping, pong chan struct{}) {
	for {
		select {
		case <-ping:
			fmt.Println("ping")
			pong<- struct{}{}
		case <-pong:
			fmt.Println("    pong")
			ping<- struct{}{}
		}
	}
}

例子2

package main

import (
	"fmt"
	"time"
)

func main() {
	pingChan := make(chan int, 1)
	pongChan := make(chan int, 1)

	go ping(pingChan, pongChan)
	go pong(pongChan, pingChan)

	pingChan <- 1

	select {}
}

func ping(pingChan <-chan int, pongChan chan<- int) {
	for {
		ball := <-pingChan

		fmt.Println("Ping", ball)
		time.Sleep(1 * time.Second)

		pongChan <- ball+1
	}
}

func pong(pongChan <-chan int, pingChan chan<- int) {
	for {
		ball := <-pongChan

		fmt.Println("Pong", ball)
		time.Sleep(1 * time.Second)

		pingChan <- ball+1
	}
}

测试

Ping 1
Pong 2
Ping 3
Pong 4
Ping 5
Pong 6
Ping 7
Pong 8
Ping 9
Pong 10
Ping 11
Pong 12
...
...
...