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)
}
解説
-
goroutine関数:
-
goroutine
は整数スライス[]int
とチャネルchan int
を引数に取ります。 - この関数は、スライス内の全ての整数の合計を計算し、その結果をチャネルに送信します。
-
-
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):
- チャネルはゴルーチン間でデータを受け渡すための通信手段です。
- チャネルを使うことで、ゴルーチン間の同期を簡単に行うことができます。
- チャネルにデータを送信する操作は、受信者がデータを受け取るまでブロックされます。同様に、チャネルからデータを受信する操作も、送信者がデータを送るまでブロックされます。