package main
import "fmt"
// producer関数は、0から9までの整数をfirstチャネルに送信します
func producer(first chan int) {
defer close(first) // 関数が終了する前にチャネルを閉じる
for i := 0; i < 10; i++ {
first <- i // チャネルに整数を送信
}
}
// multi2関数は、firstチャネルから受信した整数を2倍にしてsecondチャネルに送信します
func multi2(first chan int, second chan int) {
defer close(second) // 関数が終了する前にチャネルを閉じる
for i := range first { // firstチャネルから値を受信し、チャネルが閉じられるまでループ
second <- i * 2 // 受信した整数を2倍にしてsecondチャネルに送信
}
}
// multi4関数は、secondチャネルから受信した整数を4倍にしてthirdチャネルに送信します
func multi4(second chan int, third chan int) {
defer close(third) // 関数が終了する前にチャネルを閉じる
for i := range second { // secondチャネルから値を受信し、チャネルが閉じられるまでループ
third <- i * 4 // 受信した整数を4倍にしてthirdチャネルに送信
}
}
func main() {
// チャネルを作成
first := make(chan int)
second := make(chan int)
third := make(chan int)
// goroutineを使って非同期に関数を実行
go producer(first)
go multi2(first, second)
go multi4(second, third)
// thirdチャネルから値を受信し、チャネルが閉じられるまでループして結果を表示
for result := range third {
fmt.Println(result) // thirdチャネルから受信した値を表示
}
}
解説
-
パッケージ宣言:
package main
-
main
パッケージは、Goプログラムのエントリーポイントです。
-
-
インポート宣言:
import "fmt"
- 標準ライブラリの
fmt
パッケージをインポートします。これを使用してコンソールに出力します。
- 標準ライブラリの
-
producer関数:
func producer(first chan int) { defer close(first) for i := 0; i < 10; i++ { first <- i } }
-
first
チャネルに0から9までの整数を送信する関数です。 -
defer close(first)
は、関数が終了する直前にfirst
チャネルを閉じることを保証します。 -
first <- i
はi
の値をfirst
チャネルに送信します。
-
-
multi2関数:
func multi2(first chan int, second chan int) { defer close(second) for i := range first { second <- i * 2 } }
-
first
チャネルから受信した値を2倍にしてsecond
チャネルに送信する関数です。 -
for i := range first
は、first
チャネルが閉じられるまで値を受信し続けます。
-
-
multi4関数:
func multi4(second chan int, third chan int) { defer close(third) for i := range second { third <- i * 4 } }
-
second
チャネルから受信した値を4倍にしてthird
チャネルに送信する関数です。 -
for i := range second
は、second
チャネルが閉じられるまで値を受信し続けます。
-
-
main関数:
func main() { first := make(chan int) second := make(chan int) third := make(chan int) go producer(first) go multi2(first, second) go multi4(second, third) for result := range third { fmt.Println(result) } }
-
main
関数はプログラムのエントリーポイントです。 -
make(chan int)
でチャネルを作成します。 -
go
キーワードを用いて、goroutineとしてproducer
、multi2
、multi4
関数を非同期に実行します。 -
for result := range third
でthird
チャネルから値を受信し、チャネルが閉じられるまで値を表示し続けます。
-
このコードは、複数のgoroutineとチャネルを使用してデータをパイプライン処理する例です。それぞれのステージ(producer
、multi2
、multi4
)は独立して動作し、チャネルを介してデータを受け渡します。