在这个例子中,我们将创建一个带有 "缓冲 "通道的 "乒乓 "游戏。将会有两个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
...
...
...