Go言語は、並行処理を言語レベルでサポートしていることが大きな特徴です。特に GoroutinesChannels は、複雑な並行処理をシンプルに記述するための強力なツールです。

Goroutinesとは#

Goroutineは、Goのランタイムによって管理される軽量なスレッドです。

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")
}

上記のコードでは、say("world") が新しいGoroutineで実行され、say("hello") はメインのGoroutineで実行されます。これにより、両方の関数が同時に動作しているかのように見えます。

Channels#

Channelは、Goroutine間でデータを送受信するためのパイプのようなものです。

package main

import "fmt"

func sum(s []int, c chan int) {
	sum := 0
	for _, v := range s {
		sum += v
	}
	c <- sum // send sum to c
}

func main() {
	s := []int{7, 2, 8, -9, 4, 0}

	c := make(chan int)
	go sum(s[:len(s)/2], c)
	go sum(s[len(s)/2:], c)
	x, y := <-c, <-c // receive from c

	fmt.Println(x, y, x+y)
}

このように、Go言語では安全かつ簡単に並行処理を実装することができます。

関連記事#