0
0

Go言語(Golang) 並行処理(goroutineとchannel)

Posted at
package main

import "fmt"

// goroutineは整数スライスsの要素の合計を計算し、結果をチャネルcに送信します。
func goroutine(s []int, c chan int) {
    sum := 0
    // スライスsの各要素をループで回し、sumに加算していきます。
    for _, v := range s {
        sum += v
    }
    // 計算した合計値sumをチャネルcに送信します。
    c <- sum
}

func main() {
    // 整数のスライスsを初期化します。
    s := []int{1, 2, 3, 4, 5}
    // 整数型のチャネルcを作成します。
    c := make(chan int)
    // goroutineをゴルーチンとして起動します。これにより並行処理が行われます。
    go goroutine(s, c)
    // チャネルcから値を受信し、それを変数xに代入します。
    x := <-c
    // 受信した値(スライスsの合計値)を出力します。
    fmt.Println(x)
}

解説

  1. goroutine関数:

    • goroutineは整数スライス[]intとチャネルchan intを引数に取ります。
    • この関数は、スライス内の全ての整数の合計を計算し、その結果をチャネルに送信します。
  2. main関数:

    • スライスsを初期化します。ここでは{1, 2, 3, 4, 5}という整数の列です。
    • make(chan int)を使って、整数型のチャネルcを作成します。
    • go goroutine(s, c)を呼び出すことで、goroutine関数をゴルーチンとして起動します。これにより、goroutineは並行して実行されます。
    • x := <-cはチャネルcから値を受信します。この操作は、goroutineがチャネルに値を送信するまでブロックされます(待機します)。
    • 最後に、受信した値(スライスsの合計値)をfmt.Println(x)で出力します。

ゴルーチンとチャネルのポイント

  • ゴルーチン(goroutine):

    • ゴルーチンは軽量なスレッドのようなもので、goキーワードを使って関数を並行処理として実行します。
    • ゴルーチンは非常に低コストで生成でき、多数のゴルーチンを同時に実行することが可能です。
  • チャネル(channel):

    • チャネルはゴルーチン間でデータを受け渡すための通信手段です。
    • チャネルを使うことで、ゴルーチン間の同期を簡単に行うことができます。
    • チャネルにデータを送信する操作は、受信者がデータを受け取るまでブロックされます。同様に、チャネルからデータを受信する操作も、送信者がデータを送るまでブロックされます。
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