サンプルで学ぶ Go 言語:Channels

チャネル(channel)は平行に動くゴルーチンを繋ぐパイプである。 あるゴルーチンからチャネルに値を送り、別のゴルーチンでその値を受取れるのだ。

package main
import "fmt"
func main() {

make(chan value-type) で新しいチャネルを作れる。 チャネルの型にはそれを通る値の型が入っている。

    messages := make(chan string)

channel <- と書けばチャネルに値を送信できる。 ここでは、新たなゴルーチンから、"ping" を先程作ったチャネル messages に送っている。

    go func() { messages <- "ping" }()

<-channel と書けばそのチャネルから値を受信する。 ここでは上で送った "ping" メッセージを受信し、表示している。

    msg := <-messages
    fmt.Println(msg)
}

プログラムを起動すると、"ping" は一方のゴルーチンから他方のゴルーチンへ、チャネルを通じて届く。

$ go run channels.go 
ping

デフォルトでは送信側と受信側の両方が準備できるまで、送受信はブロックする。 この性質によって、プログラムの最後では単に "ping" を待つだけで、それ以外の同期が必要なくなっている。

次の例:Channel Buffering