select
複数のチャンネルを同時に監視し、どれか1つが準備できたときに処理を進める。
複数の case の準備ができている場合、case はランダムに選択される。
package main
import "fmt"
func fibonacci(c, quit chan int) {
x, y := 0, 1
for {
select {
case c <- x:
x, y = y, x+y
case <-quit:
fmt.Println("quit")
return
}
}
}
func main() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0; i < 10; i++ {
fmt.Println(<-c)
}
quit <- 0
}()
fibonacci(c, quit)
}
fibonacci関数
フィボナッチ数列を生成し、チャンネルcに送信。また、チャンネルquitを監視し、終了指示があれば処理を停止。
case c <- x
: 現在のフィボナッチ数xをcに送信。次のフィボナッチ数を計算し、xとyを更新。
case <-quit
: quitチャンネルから値を受け取った場合、"quit"と出力して関数を終了。
func fibonacci(c, quit chan int) {
x, y := 0, 1
for {
select {
case c <- x:
x, y = y, x+y
case <-quit:
fmt.Println("quit")
return
}
}
}
main関数
cとquitチャンネルの作成
c
: フィボナッチ数列の値を送受信するためのチャンネル。
quit
: 処理終了のシグナルを送るためのチャンネル。
c := make(chan int)
quit := make(chan int)
ゴルーチン起動
forループで10回、チャンネルcからフィボナッチ数を受信し、それをfmt.Printlnで出力。
10回の出力後、チャンネルquitに0を送信してfibonacci関数の終了を指示。
go func() {
for i := 0; i < 10; i++ {
fmt.Println(<-c)
}
quit <- 0
}()
fibonacci関数の呼び出し
無限ループを開始し、ゴルーチンがquitに値を送るまで処理は継続。
fibonacci(c, quit)