3

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 を続けて取得したりすることはできません)。これはどのように作動しますか?

4

2 に答える 2

1

最近チャネルに入るメッセージの選択順序に関する関連する質問がありました。

答えは、通常、順序は非決定論的であるということです。これは意図的なものです。

于 2015-03-17T21:29:41.823 に答える