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)
}
著者は次のように書いています。
「プログラムは ping と pong を交互に出力します。」
ただし、これを実現するには、送信者がチャネルに送信できる順序を Go が決定する必要があります。そうしないと、ping が pong の前に送信されるという保証はありません (つまり、2 つの ping を取得したり、2 つの pong を続けて取得したりすることはできません)。これはどのように作動しますか?