技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

Buffered channels【Go】

容量が決められたchannelのことを指します。

容量を決めるにはmakeを使用し、第2引数で指定します。

c := make(chan int, 2)    // サイズ2のchannel

サイズを超える数をchannelに入れようとすると、deadlockエラーが発生します。

c := make(chan int, 2)
c <- 100
c <- 200
c <- 300    // 3つ目を投入しようとしたので、エラー


また、channelから送信することで、channelの容量を1つ空けることができます。
channelからは、先に入れたものから取り出すことができます。

c := make(chan int, 2)
c <- 100
c <- 200
x := <-c    // 容量が1つ空く
fmt.Println(x)    // 100
c <- 300    // 問題なく受信


rangeを使ったforループを行う際、channelのindex最大値を知らせる、
close(channel)を事前に実行する必要があります。

c := make(chan int, 2)
c <- 100
c <- 200

close(c)   // 事前にchannelのindex最大値を知らせる

for v := range c {
    fmt.Println(v)
}