generated at
GoのChannel
GoのChannel

チャネルとは
データを順序よく受け渡すためのデータ構造
キュー。データをためる配列。ランダムアクセスできない。投入した順番に値が出てくる
投入と取り出しのみができる
並列処理されても正しくデータを受け渡す同期機構
読み込み・書き込みで準備ができるまでブロックする機能



チャネルの作成
make() を使う
Go
tasks := make(chan string) // バッファなし tasks := make(chan string, 10) // バッファあり
バッファの有無
キューの中に溜められる処理数の数のようなイメージ
バッファなしの場合、受け取り側が受信しないと、送信側もブロックされる
バッファありの場合、バッファに余裕がある間は、次の行に進められる


チャネルへのデータの送受信
Go
// チャネルへデータを送信する channel <- "cmake .." // チャネルからデータを受信する task := <- channel task, ok := <- channel // クローズ判定も一緒に <- channel // データを読みててもいい

for文と組み合わせる
Go
func primeNumber() chan int { result := make(chan int) go func() { result <- 2 for i := 3; i < 100; i += 2 { result <- i time.Sleep(time.Second * 1) } close(result) }() return result } func main() { pn := primeNumber() // ここで1秒置きに値を受信する for n := range pn { // 1つ受信したら1つループが回る fmt.Println(n) } }

select文
複数のチャネルを使い分ける

context
深いネストの中、あるいは派生ジョブなどがあって複雑なロジックの中でも、正しく終了やキャンセル、タイムアウトが実装できるようにする仕組み