Go言語のゴルーチンとチャネル
こんにちは!今回はGo言語の特徴的な機能である「ゴルーチン」および「チャネル」について学んでいきましょう。
これらの機能はGo言語の並行処理を実現するための重要な要素となります。
並行処理とは、複数のタスクを同時に実行することを指します。
例えば、Webサーバーでは多くのユーザーからのリクエストを同時に処理する必要があります。
そのような場合に、Go言語のゴルーチンとチャネルが役立ちます。
ゴルーチンとは
ゴルーチンは、Go言語で並行処理を実現するための軽量なスレッドのことを指します。
Go言語では、関数の前に「go」キーワードをつけるだけで、その関数を新しいゴルーチンで実行することができます。
ソースコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package main import ( "fmt" "time" ) func say(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func main() { go say("world") say("hello") } |
上記のコードでは、"hello"と"world"を交互に出力します。
"world"は新しいゴルーチンで実行され、"hello"はメインゴルーチン(main関数)で実行されます。
出力結果
world
hello
world
hello
world
hello
world
hello
world
チャネルとは
チャネルは、ゴルーチン間でデータの送受信を行うための通信メカニズムです。
チャネルは、「make」関数で作成し、チャネル演算子(<-)を使用してデータを送受信します。
その通りです。
チャネルを使用することで、ゴルーチン間でデータの送受信を行うことができます。
これにより、複数のゴルーチンが同じデータを操作する際の競合を防ぐことができます。
ソースコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package main import "fmt" func sum(a []int, c chan int) { sum := 0 for _, v := range a { sum += v } c <- sum // send sum to c } func main() { a := []int{7, 2, 8, -9, 4, 0} c := make(chan int) go sum(a[:len(a)/2], c) go sum(a[len(a)/2:], c) x, y := <-c, <-c // receive from c fmt.Println(x, y, x+y) } |
上記のコードでは、配列の前半と後半の合計をそれぞれ異なるゴルーチンで計算し、その結果をチャネルを通じてmain関数に送ります。
main関数では、2つのゴルーチンからの結果を受け取り、その合計を出力します。
出力結果
-5 17 12
まとめ
この記事では、Go言語のゴルーチンとチャネルについて学びました。
ゴルーチンは、Go言語で並行処理を実現するための軽量なスレッドで、関数の前に「go」キーワードをつけるだけで新しいゴルーチンで実行することができます。
また、チャネルはゴルーチン間でデータの送受信を行うための通信メカニズムで、複数のゴルーチンが同じデータを操作する際の競合を防ぐことができます。
Go言語のこの特性を理解し、効率的なプログラムを書くことができれば、より良いソフトウェア開発が可能になります。
最後まで読んで頂き、ありがとうございました。少しでもお役にたてたなら幸いです!