チャネル
Goの機能で,Goroutinesの出力などを受け取り変数に出力する.
受け取った入力をバッファするため,バッファとして利用可能.
バッファなしのチャネルは送った値を受け取る機構が必要.
値を受け取るまで停止するなどの機能から,同期を実現するために有用.
複数個のGoroutinesを待つ場合はsync.WaitGroupが便利.
バッファありのチャネルはセマフォのように利用できる.
code:semaphone.go
var sem = make(chan int, MaxOutstanding)
func handle(r *Request) {
sem <- 1 // semが溢れそうだとここでgoroutineが止まる
process(r)
<-sem // Done, enable next request to run.
}
func Serve(queue chan *Request) {
for {
req := <-queue
go handle(req)
}
}
色々な状態がある
nilかどうか
closedかどうか
バッファの中身
送信専用/受信専用
<-chan Tやchan<- Tなどが型としてある.
interfaceとして受信だけを許可したチャネルを渡し,送信は自分の方でやるみたいな関数とか.