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

Go言語の無名goroutineを使って並行処理を簡単に試そう

Go言語の無名goroutineを使って並行処理を簡単に試そう
Go言語の無名goroutineを使って並行処理を簡単に試そう

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

生徒

「先生、goroutineには名前のない関数をそのまま並行で動かす方法があるって聞きました。無名関数って何ですか?」

先生

「いい質問だよ。無名関数は名前を持たないその場で書ける関数で、Goではgoの前につけるだけで簡単に並行処理が作れます。まずはイメージから説明しますね。」

生徒

「イメージだとどんな感じですか?」

先生

「台所でお皿を洗いながらご飯を炊くようなものです。どちらも同時に進めたい作業を、無名goroutineならコードを短く書いて同時に動かせます。」

1. 無名goroutineとは?

1. 無名goroutineとは?
1. 無名goroutineとは?

無名goroutineは、関数に名前を付けずにその場で定義した関数を、goキーワードで別の実行単位として走らせる方法です。短い処理や一時的な並行処理を試すときに便利です。

用語の補足:goroutine(ゴルーチン)はGoの軽量な並行処理単位、無名関数は名前を持たないその場で定義する関数です。

2. 基本的な書き方

2. 基本的な書き方
2. 基本的な書き方

無名goroutineは、無名関数の前にgoをつけるだけで作れます。とてもシンプルです。


package main

import (
    "fmt"
    "time"
)

func main() {
    go func() {
        fmt.Println("無名goroutine: はじめまして")
    }()

    fmt.Println("メイン関数: こちらが先に出る場合もある")
    time.Sleep(100 * time.Millisecond) // goroutineが動く時間を確保
}

ポイントは、メイン関数がすぐに終了するとgoroutineも止まってしまうことです。短いテストではtime.Sleepで待つことがありますが、本番ではsync.WaitGroupなどを使って確実に待ち合わせします。

3. 無名goroutineで引数や変数を使うときの注意

3. 無名goroutineで引数や変数を使うときの注意
3. 無名goroutineで引数や変数を使うときの注意

無名関数内で外側の変数を参照すると、ループや並行処理で意図しない値が使われることがあります。特にループ内でgoroutineを立てるときは、変数のコピーを渡すと安全です。


for i := 0; i < 3; i++ {
    go func(n int) {
        fmt.Println("値:", n)
    }(i) // iを引数として渡してコピーする
}
time.Sleep(500 * time.Millisecond)

このように引数で値を渡すと、各goroutineは期待どおりのiの値を受け取れます。もし引数にしないで直接外側のiを参照すると、すべてのgoroutineが最終値を見る場合があります。

4. 実用的な例:並列で複数の処理を試す

4. 実用的な例:並列で複数の処理を試す
4. 実用的な例:並列で複数の処理を試す

無名goroutineは、複数の短いタスクを同時に試したいときに有用です。次の例は、3つの短い処理を並行で行い、結果をチャネルで受け取る例です。


package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan string)

    for i := 1; i <= 3; i++ {
        idx := i
        go func() {
            time.Sleep(time.Duration(100*idx) * time.Millisecond)
            ch <- fmt.Sprintf("タスク%d 完了", idx)
        }()
    }

    for i := 1; i <= 3; i++ {
        fmt.Println(<-ch)
    }
}

このプログラムでは、無名goroutineがそれぞれ遅延後にチャネルへメッセージを送ります。メイン関数はチャネルから順に受信して出力します。

5. WaitGroupを使った安全な待ち合わせ

5. WaitGroupを使った安全な待ち合わせ
5. WaitGroupを使った安全な待ち合わせ

実際のプログラムでは、time.Sleepに頼るのは良くありません。代わりにsync.WaitGroupを使うと、全てのgoroutineの終了を確実に待てます。


package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    for i := 1; i <= 3; i++ {
        wg.Add(1)
        idx := i
        go func() {
            defer wg.Done()
            fmt.Println("処理中:", idx)
        }()
    }
    wg.Wait()
    fmt.Println("すべてのgoroutineが終了しました")
}

この例では、無名goroutine内でwg.Done()を呼ぶことでメインがwg.Wait()で待機でき、確実に全ての処理が終わるまで次に進みません。

Go言語を基礎からスッキリ学びたい人や、 文法だけでなく「実用的な使い方」まで押さえたい人には、 定番の入門書がこちらです。

基礎からわかるGo言語をAmazonで見る

※ Amazon広告リンク

6. 無名goroutineを試すときのポイント

6. 無名goroutineを試すときのポイント
6. 無名goroutineを試すときのポイント
  • 短いテストや使い捨ての処理に便利。
  • ループ内で外側の変数を参照するときは値をコピーする(引数で渡す)。
  • time.Sleepで待つのは簡単だが本番向けではない。sync.WaitGroupを使おう。
  • goroutineは軽量だが、無制限に作るとメモリやスケジューリングに負荷がかかるので注意する。

無名goroutineは並行処理を手早く試すのに最適です。まずは短いサンプルを動かして、並行実行の出力の仕方やタイミングの変化を観察してみましょう。

関連セミナーのご案内

【超入門】ゼロから始めるGo言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導

「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。

本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。

具体的な開発内容と環境

【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。

【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。

この60分で得られる3つの理解

1. 環境構築の完全な理解

「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。

2. Go言語の基本構造(変数・型)

データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。

3. 読みやすいコードの書き方

ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。

※本講座は、将来的にバックエンドエンジニアクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。

セミナー画像

初めてのGo言語を一緒に学びましょう!

カテゴリの一覧へ
新着記事
New1
Swift
Swiftのnilとは?Optionalとの関係や初期化について初心者向けにやさしく解説!
New2
Go言語
Go言語のinit関数の役割と使い方!プログラム起動時の初期化処理
New3
Go言語
Go言語のマップの順序保証がない理由と扱い方の工夫をやさしく解説!初心者でもわかる基本知識
New4
Kotlin
Kotlinのforループの基本!範囲・配列・コレクションの繰り返し処理
人気記事
No.1
Java&Spring記事人気No1
Kotlin
Kotlinのsettings.gradleファイルを完全解説!初心者でもわかるプロジェクト設定の基本
No.2
Java&Spring記事人気No2
Go言語
Swiftの配列(Array)の使い方を完全ガイド!初心者でもわかるデータのまとめ方
No.3
Java&Spring記事人気No3
Go言語
Go言語のSQLインジェクション対策を完全解説!初心者でも安全なデータベース操作がわかる
No.4
Java&Spring記事人気No4
Swift
Swiftの高階関数map・filter・reduceを完全解説!初心者でもわかる配列操作の基本
No.5
Java&Spring記事人気No5
Go言語
Swiftの文字列操作を完全ガイド!初心者でもわかるStringの基本
No.6
Java&Spring記事人気No6
Go言語
Go言語のgo installコマンドの役割とインストール先の仕組みを徹底解説!
No.7
Java&Spring記事人気No7
Kotlin
KotlinのRoomで複雑なクエリを使いこなす!初心者でもわかる応用テクニック
No.8
Java&Spring記事人気No8
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方