ゴルーチン (Goroutine)
ゴルーチンは、軽量なスレッドのようなもので、Go言語では go
キーワードを使用して定義します。ゴルーチンを使用することで、関数を非同期に実行することができます。以下のように基本的に使用します。
package main
import (
"fmt"
"time"
)
func sayHello() {
fmt.Println("Hello, World!")
}
func main() {
go sayHello() // ゴルーチンとして関数を非同期に実行
time.Sleep(1 * time.Second) // 他のゴルーチンが実行される時間を確保するためにスリープ
}
上記の例では、sayHello
関数がゴルーチンとして実行されるため、main
関数は直ちに次の行に進みます。time.Sleep
は、ゴルーチンが実行される時間を確保するために使われていますが、他の方法(チャネルを使った待機など)で同期をとることもできます。
チャネル (Channel)
チャネルは、ゴルーチン間でデータを通信するための構造です。チャネルを使うことで、異なるゴルーチンが安全にデータをやりとりできます。
チャネルは以下のように宣言できます:
ch := make(chan int) // 整数型のチャネルを作成
チャネルにデータを送信するには、<-
演算子を使用します。また、データを受信するには、同様に<-
を使用します。
以下にチャネルを使った例を示します。
package main
import (
"fmt"
)
func worker(ch chan int) {
// チャネルからデータを受信
num := <-ch
fmt.Println("Received:", num)
}
func main() {
ch := make(chan int)
go worker(ch) // ゴルーチンを起動
// チャネルにデータを送信
ch <- 42
}
この例では、worker
関数が、main
から送られたデータを受信し、それを出力します。
並行処理の基本の流れ
- ゴルーチンを作成する。
- チャネルを使用してデータを送受信し、ゴルーチン間で通信する。
- 必要に応じて待機する。