goのチャネルの簡単なまとめ

Goならわかるシステムプログラミングを読んで。

概要

  • キュー構造である
    • ただしランダムアクセスはできず、投入と取り出しのみ行うことができる
  • 並列処理されても正しくデータを受け渡す同期機構である
    • goroutine間での情報共有としての利用が推奨されている
  • 読み込み・書き込みで準備ができるまでブロックする機能である
    • データがない状態で取り出そうとすると、他のgoroutineがデータを投入して読み込みの準備ができるまでブロックして待つ
    • バッファに空きがない状態で書き込もうとすると、他のgoroutineがデータを取り出して空きができるまでブロックして待つ

sample

下記スクリプトを実行する。

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("script start")
    done := make(chan bool)

    go func() {
        fmt.Println("start sub()")
        time.Sleep(2 * time.Second)
        fmt.Println("sub() is finished")
        done <- true
    }()

    fmt.Println("I'm waiting for tasks to be done")
    <-done
    fmt.Println("all tasks are finished")
}

main は <-done の箇所で、チャネルであるdoneに何らかのデータが入るのを待っている。
goroutineがdoneにtrueを入れると、all tasks are finishedとなる。

参考

mattnさんのこの記事とても分かりやすいです