カテゴリ: Go言語 更新日: 2025/12/13

Go言語のgoroutineとは?並行処理の基本をやさしく解説

Go言語のgoroutineとは?並行処理の基本をやさしく解説
Go言語のgoroutineとは?並行処理の基本をやさしく解説

先生と生徒の会話形式で理解しよう

生徒

「先生、Go言語の“並行処理”ってよく聞くんですが、どういうことなんですか?」

先生

「良い質問ですね。Go言語には“goroutine(ゴルーチン)”という仕組みがあり、これを使うと複数の処理を同時に実行できるんですよ。」

生徒

「複数の処理を同時に?なんだか難しそうです……」

先生

「心配しなくて大丈夫です。Go言語の並行処理は、他の言語と比べてもとても簡単に書けるのが特徴なんですよ。それでは、実際にgoroutineの基本から学んでいきましょう!」

1. goroutine(ゴルーチン)とは?

1. goroutine(ゴルーチン)とは?
1. goroutine(ゴルーチン)とは?

Go言語のgoroutineとは、軽量なスレッド(並行処理の単位)のことです。通常、プログラムは上から順に1つずつ命令を実行しますが、goroutineを使うと、複数の処理を同時に進めることができます。

たとえば、料理で「ご飯を炊く」と「お味噌汁を作る」を同時に進めるようなイメージです。どちらも終わるのを待たずに、同時並行で作業できるのが“並行処理”です。

Go言語では、関数の前にgoというキーワードを付けるだけで、その関数を別のgoroutineとして実行できます。


package main

import (
    "fmt"
    "time"
)

func printMessage(msg string) {
    for i := 0; i < 3; i++ {
        fmt.Println(msg)
        time.Sleep(time.Millisecond * 500)
    }
}

func main() {
    go printMessage("こんにちは、goroutine!")
    printMessage("メイン関数からのメッセージ")
}

上の例では、printMessage関数をgoキーワード付きで呼び出しています。これにより、「こんにちは、goroutine!」の処理と「メイン関数からのメッセージ」の処理が同時に実行されます。

2. 実行結果を確認してみよう

2. 実行結果を確認してみよう
2. 実行結果を確認してみよう

実際にこのプログラムを実行すると、出力が交互に表示されることがあります。これは、2つの処理が同時に動いているためです。


メイン関数からのメッセージ
こんにちは、goroutine!
メイン関数からのメッセージ
こんにちは、goroutine!
メイン関数からのメッセージ
こんにちは、goroutine!

実行の順番は毎回少しずつ変わることがあります。これは、どちらの処理が先に進むかをGoのランタイム(プログラムを実行する仕組み)が自動で調整しているためです。

3. goroutineの注意点

3. goroutineの注意点
3. goroutineの注意点

goroutineはとても便利ですが、1つ注意点があります。メイン関数が終了すると、すべてのgoroutineも強制的に終了してしまうという点です。

上の例では、time.Sleep()で少し待つことで、goroutineが実行を終える時間を確保しています。しかし、メイン関数が早く終わると、goroutineの処理が途中で止まることもあります。

そのため、複数のgoroutineを確実に完了させたい場合は、後ほど紹介するsync.WaitGroupという仕組みを使うのが一般的です。

4. goroutineを使うメリット

4. goroutineを使うメリット
4. goroutineを使うメリット

Go言語でgoroutineを使うと、次のようなメリットがあります。

  • ① 高速な並行処理が簡単にできる – Goはスレッドの管理を自動で行うため、初心者でも複雑な設定をせずに並行処理ができます。
  • ② メモリの使用が少ない – 通常のスレッドよりも軽量なので、大量のgoroutineを同時に動かすことが可能です。
  • ③ シンプルな構文 – 関数の前にgoを付けるだけで並行処理が実現します。

例えば、Webサーバーを作る場合、複数のユーザーから同時にリクエストが来ても、それぞれを別のgoroutineで処理できるため、処理が止まらずにスムーズに動作します。

5. goroutineとchannelの関係

5. goroutineとchannelの関係
5. goroutineとchannelの関係

並行処理を行うと、複数のgoroutineが同時に動くため、「どうやってデータをやり取りするのか?」という問題が出てきます。

このときに使うのがchannel(チャネル)です。channelは、goroutine間でデータを送受信するための“パイプ”のような仕組みです。


package main

import "fmt"

func main() {
    ch := make(chan string)
    go func() {
        ch <- "データを送ります!"
    }()
    msg := <-ch
    fmt.Println(msg)
}

このコードでは、chというチャネルを作り、別のgoroutineから文字列を送信しています。そして、メイン関数でそのデータを受信して出力します。これにより、複数のgoroutineが安全にデータをやり取りできるようになります。

6. goroutineの実践的なイメージ

6. goroutineの実践的なイメージ
6. goroutineの実践的なイメージ

goroutineは、まるで「複数の人が同時に仕事を進めるチーム」のようなものです。1人で全てを順番にやるよりも、複数人で分担した方が早く終わりますよね。

ただし、誰が何をしているかを共有しないと混乱してしまいます。これを助けるのが「channel(情報共有の仕組み)」というわけです。

このように、goroutineとchannelを組み合わせることで、Go言語では効率的で安全な並行処理が簡単に書けます。

カテゴリの一覧へ
新着記事
New1
Go言語
Go言語のオブジェクト指向の特徴を完全ガイド!初心者でも理解できる他言語との違い
New2
Go言語
Go言語の条件分岐の見やすい書き方を徹底解説!初心者でもわかるif文の使い方
New3
Kotlin
Kotlinのクラス設計に役立つベストプラクティスまとめ|初心者でもわかるクラス設計の考え方
New4
Kotlin
Kotlinでアーキテクチャ設計の基本!MVC・MVP・MVVMの違いを解説
人気記事
No.1
Java&Spring記事人気No1
Go言語
Go言語の関数パラメータ!値渡しと参照渡しの違いを理解しよう
No.2
Java&Spring記事人気No2
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.3
Java&Spring記事人気No3
Swift
Swift開発環境の構築方法を徹底解説!Xcode・Windows・Linux対応
No.4
Java&Spring記事人気No4
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.5
Java&Spring記事人気No5
Kotlin
Kotlinのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.6
Java&Spring記事人気No6
Go言語
Go言語のWebアプリにおけるセキュリティベストプラクティス集
No.7
Java&Spring記事人気No7
Kotlin
Kotlinの演算子一覧と使い方!算術・比較・論理演算子の基本を解説
No.8
Java&Spring記事人気No8
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!