GoのChannel
チャネルとは
データを順序よく受け渡すためのデータ構造
キュー。データをためる配列。ランダムアクセスできない。投入した順番に値が出てくる
投入と取り出しのみができる
並列処理されても正しくデータを受け渡す同期機構
読み込み・書き込みで準備ができるまでブロックする機能
チャネルの作成
make()を使う
code:Go
tasks := make(chan string) // バッファなし
tasks := make(chan string, 10) // バッファあり
バッファの有無
キューの中に溜められる処理数の数のようなイメージ
バッファなしの場合、受け取り側が受信しないと、送信側もブロックされる
バッファありの場合、バッファに余裕がある間は、次の行に進められる
チャネルへのデータの送受信
code:Go
// チャネルへデータを送信する
channel <- "cmake .."
// チャネルからデータを受信する
task := <- channel
task, ok := <- channel // クローズ判定も一緒に
<- channel // データを読みててもいい
for文と組み合わせる
code: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
深いネストの中、あるいは派生ジョブなどがあって複雑なロジックの中でも、正しく終了やキャンセル、タイムアウトが実装できるようにする仕組み