Channels
#
// <em>チャネル(channel)</em>は平行に動くゴルーチンを繋ぐパイプである。
// あるゴルーチンからチャネルに値を送り、別のゴルーチンでその値を受取れるのだ。
package main
import "fmt"
func main() {
// `make(chan value-type)` で新しいチャネルを作れる。
// チャネルの型にはそれを通る値の型が入っている。
messages := make(chan string)
// `channel <-` と書けばチャネルに値を<em>送信</em>できる。
// ここでは、新たなゴルーチンから、`"ping"` を先程作ったチャネル `messages` に送っている。
go func() { messages <- "ping" }()
// `<-channel` と書けばそのチャネルから値を<em>受信</em>する。
// ここでは上で送った `"ping"` メッセージを受信し、表示している。
msg := <-messages
fmt.Println(msg)
}
# プログラムを起動すると、`"ping"` は一方のゴルーチンから他方のゴルーチンへ、チャネルを通じて届く。
$ go run channels.go
ping
# デフォルトでは送信側と受信側の両方が準備できるまで、送受信はブロックする。
# この性質によって、プログラムの最後では単に `"ping"` を待つだけで、それ以外の同期が必要なくなっている。