カテゴリ: 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
Kotlin
Kotlinの構文ルールまとめ!インデント・セミコロンなど初心者が最初に覚えるべきポイント
New2
Kotlin
Kotlinの関数ドキュメンテーションコメント(KDoc)の書き方を徹底解説!初心者でもわかる丁寧なガイド
New3
Kotlin
KotlinでHello Worldを表示するには?最初の1行を実行してみよう
New4
Go言語
Go言語の依存関係管理を始めよう!go modの基本設定と導入手順
人気記事
No.1
Java&Spring記事人気No1
Kotlin
KotlinのAPI通信でGETリクエストを送る方法!初心者向け徹底ガイド
No.2
Java&Spring記事人気No2
Go言語
Go言語のテストでタイムアウト・並行処理を扱うポイント
No.3
Java&Spring記事人気No3
Go言語
Go言語の関数パラメータ!値渡しと参照渡しの違いを理解しよう
No.4
Java&Spring記事人気No4
Swift
SwiftのURLSessionでのネットワークエラー対策!再試行とタイムアウトを初心者向けに解説
No.5
Java&Spring記事人気No5
Go言語
Go言語のWebアプリにおけるセキュリティベストプラクティス集
No.6
Java&Spring記事人気No6
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.7
Java&Spring記事人気No7
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.8
Java&Spring記事人気No8
Swift
Swift JSONデコード失敗の原因と対処|DecodingError徹底解説