0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

select【Go】

Posted at

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)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?