チャネルに対する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
を呼び出すと,チャネルの容量を取得することができます.
ch1 := make(chan int, 10)
// 10
fmt.Println(cap(ch1))
ch2 := make(chan int)
// 0
fmt.Println(cap(ch2))
また,組込み関数のlen
を呼び出すとバッファ内にある値の数を取得することができます.
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))