考虑一下来自http://www.golang-book.com/10/index.htm#section2的乒乓球例子。
作者写道:
package main
import (
"fmt"
"time"
)
func pinger(c chan string) {
for i := 0; ; i++ {
c <- "ping"
}
}
func ponger(c chan string) {
for i := 0; ; i++ {
c <- "pong"
}
}
func printer(c chan string) {
for {
msg := <- c
fmt.Println(msg)
time.Sleep(time.Second * 1)
}
}
func main() {
var c chan string = make(chan string)
go pinger(c)
go ponger(c)
go printer(c)
var input string
fmt.Scanln(&input)
}
作者写道:
然而,为了使这成立,Go必须决定发送者可以按照什么顺序向通道发送数据?否则,就无法保证在发送pong之前会先发送ping(即你不能连续得到两个ping或两个pong)。这是如何实现的?“该程序现在将轮流打印ping和pong。”