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さんのこの記事とても分かりやすいです