0
0

Go言語(Golang) Goroutine記述例

Posted at
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チャネルから受信した値を表示
	}
}

解説

  1. パッケージ宣言:

    package main
    
    • mainパッケージは、Goプログラムのエントリーポイントです。
  2. インポート宣言:

    import "fmt"
    
    • 標準ライブラリのfmtパッケージをインポートします。これを使用してコンソールに出力します。
  3. 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 <- iiの値をfirstチャネルに送信します。
  4. 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チャネルが閉じられるまで値を受信し続けます。
  5. 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チャネルが閉じられるまで値を受信し続けます。
  6. 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としてproducermulti2multi4関数を非同期に実行します。
    • for result := range thirdthirdチャネルから値を受信し、チャネルが閉じられるまで値を表示し続けます。

このコードは、複数のgoroutineとチャネルを使用してデータをパイプライン処理する例です。それぞれのステージ(producermulti2multi4)は独立して動作し、チャネルを介してデータを受け渡します。

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