チャネルに対するcapとlenについて #golang

August 11, 2014

この記事はQiitaの記事をエクスポートしたものです。内容が古くなっている可能性があります。

チャネルの容量

 Go言語のチャネルには容量というものが指定できます.通常,チャネルを作成するには,組込み関数のmakeを使いますが,その第2引数で容量を渡すことができます.第2引数を省略した場合は,容量0のチャネルとなります.

// 容量0
ch1 := make(chan int)
// 容量10
ch2 := make(chan int, 10)

 チャネルの容量は中に保持しておけるバッファのサイズを指しており,バッファがいっぱいになるとチャネルの送信はブロックされます.また,バッファ内に値がない場合は,チャネルからの受信はブロックされます.

ch := make(chan int, 1)
ch <- 100 // ブロックしない
ch <- 200 // ブロックする

capとlen

 チャネルに対して,組込み関数のcapを呼び出すと,チャネルの容量を取得することができます.

Go Playgroundで実行

ch1 := make(chan int, 10)
// 10
fmt.Println(cap(ch1))

ch2 := make(chan int)
// 0
fmt.Println(cap(ch2))

 また,組込み関数のlenを呼び出すとバッファ内にある値の数を取得することができます.

Go Playgroundで実行

ch := make(chan struct{}, 10)
ch <- struct{}{}
// cap: 10 len: 1
fmt.Println("cap:", cap(ch), "len:", len(ch))
<-ch
// cap: 10 len: 0
fmt.Println("cap:", cap(ch), "len:", len(ch))