Go言語のコードを初めて見たエンジニアが、まず驚くことの一つに「while文が存在しない」という点が挙げられます。

C言語やJava、Pythonといった主要な言語の多くは、反復処理のためにfor文とwhile文の二種類を備えていますが、Go言語はあえて一方を排除しました。

この記事では、なぜGo言語にはwhile文がないのかという設計思想から、for文を用いた具体的な代用パターンまでを詳しく解説します。

2026年現在のモダンな開発現場においても、このシンプルさはGo言語の大きな魅力として評価され続けています。

Goプログラミングにおけるループ処理の極意を、基礎から応用までマスターしていきましょう。

なぜGo言語にはwhile文が存在しないのか

Go言語の設計思想における核心的なキーワードは、「シンプルさ(Simplicity)」と「直感性」です。

Googleによって開発されたこの言語は、複雑になりがちなソフトウェア開発をより効率的で読みやすいものにすることを目指して作られました。

他の言語において、for文とwhile文は機能的に重複する部分が多く、開発者はどちらを使うべきか迷う場面が少なくありません。

Go言語の設計者たちは、同じ目的を達成するための手段が複数存在することを嫌い、ループ処理という概念を「for」という一つのキーワードに統合しました。

キーワードを最小限に抑える利点

言語仕様からwhileというキーワードを削除したことで、Go言語のコンパイラはよりシンプルになり、解析速度が向上しています。

また、コードを読む側にとっても、反復処理を見つけた瞬間に「これはfor文である」と即座に認識できるため、認知負荷が軽減されます。

「1つの目的には1つの手段」という徹底したルールが、Go言語特有の読みやすさとメンテナンス性の高さを支えているのです。

学習コストの低減

構文が少ないということは、これからGo言語を学ぶ初心者にとっても大きなメリットとなります。

while文の使い方やdo-while文の特殊な挙動を個別に覚える必要はなく、for文のバリエーションさえ学べば全ての反復処理が可能になるからです。

これは大規模なチーム開発において、メンバー間での記述スタイルの揺れを抑える効果も発揮しています。

while文の代用となるfor文の記述パターン

Go言語では、for文の構文を柔軟に変化させることで、他言語のwhile文と全く同じ機能を実現できます。

ここでは、最も一般的な「条件式のみを指定するパターン」を見ていきましょう。

条件式のみを指定する (while型)

他言語で while (condition) { ... } と記述する処理は、Go言語では以下のように記述します。

Go
package main

import "fmt"

func main() {
    count := 0

    // conditionのみを記述する。これが他言語のwhile文に相当する。
    for count < 5 {
        fmt.Printf("現在のカウント: %d\n", count)
        count++
    }
}
実行結果
現在のカウント: 0
現在のカウント: 1
現在のカウント: 2
現在のカウント: 3
現在のカウント: 4

このように、forキーワードの後に条件式だけを記述することで、その条件が真(true)である間、処理が繰り返されます。

セミコロンによる区切りを省略できるため、見た目も非常にスッキリとした印象になります。

無限ループを記述する (while(true)型)

サーバープログラムや常駐プロセスなどでよく使われる無限ループも、Go言語では極めてシンプルです。

他言語では while(true) と書くことが多いですが、Go言語では条件式すら省略します。

Go
package main

import (
    "fmt"
    "time"
)

func main() {
    i := 0
    // 何も指定しないfor文は無限ループとなる。
    for {
        if i >= 3 {
            // ループを抜ける条件
            break
        }
        fmt.Println("実行中...")
        time.Sleep(1 * time.Second)
        i++
    }
    fmt.Println("終了")
}
実行結果
実行中...
実行中...
実行中...
終了

「for { … }」という記述だけで無限ループを表現できる点は、Go言語の簡潔さを象徴しています。

while true と書くよりもタイピング数が少なく、意味も明確です。

Go言語でdo-while文を再現する方法

多くの言語に存在する「最低1回は必ず実行される」do-while文も、Go言語には存在しません。

しかし、無限ループとbreak文を組み合わせることで、同様のロジックを安全に構築することが可能です。

初回実行を保証するループ構造

以下のコード例では、条件判定をループの最後に行うことでdo-while文の挙動を再現しています。

Go
package main

import "fmt"

func main() {
    number := 10

    for {
        // 処理が最初に必ず実行される
        fmt.Printf("処理を実行: %d\n", number)
        number++

        // ループの最後で条件を判定する (do-whileの再現)
        if number >= 13 {
            break
        }
    }
}
実行結果
処理を実行: 10
処理を実行: 11
処理を実行: 12

このパターンは、ユーザーからの入力を一度受け取ってからバリデーションを行う場合などに非常に有効です。

専用の構文がなくても、既存のパーツを組み合わせるだけで十分に実用的なコードが書けることがわかります。

for rangeによるコレクションの反復処理

Go言語において、while文の代用以上に頻繁に使われるのが for range 構文です。

スライスやマップの全要素を処理する場合、インデックスを手動で管理するwhile文形式よりも、rangeを使う方がバグが入り込みにくく安全です。

Go
package main

import "fmt"

func main() {
    fruits := []string{"apple", "banana", "cherry"}

    // rangeを使うことでインデックスと値を同時に取得できる
    for i, fruit := range fruits {
        fmt.Printf("%d番目の要素: %s\n", i, fruit)
    }
}
実行結果
0番目の要素: apple
1番目の要素: banana
2番目の要素: cherry

もしインデックスが必要ない場合は、ブランク識別子 _ を使うことで変数を破棄できます。

「while文がない」と嘆く前に、この強力な for range を使いこなすことがGoプログラマへの第一歩と言えるでしょう。

他言語との比較:ループ構文の違い

ここで、Go言語と他の主要なプログラミング言語におけるループキーワードの違いを表にまとめました。

言語標準的なループ条件式ループ後判定ループ
Goforfor(for + breakで代用)
C / C++forwhiledo-while
Javaforwhiledo-while
Pythonfor (in)while(なし)

表を見ると分かる通り、Go言語はすべての反復キーワードを「for」に一元化している唯一の言語です。

この徹底した合理化が、Go言語を「エンジニアのための実用言語」たらしめています。

ループ処理におけるベストプラクティス

Go言語で効率的なループを書くためには、いくつか守るべきルールがあります。

まず、可能な限り for range を使用することを検討してください。

スライスの範囲外アクセスを自動的に防いでくれるため、コードの堅牢性が高まります。

次に、複雑な条件での中断が必要な場合は、ラベル付きのbreak文を活用しましょう。

ネストされたループを一気に抜け出したい場合、ラベルを使うことでコードの可読性を損なわずに制御フローを記述できます。

Go
package main

import "fmt"

func main() {
Loop:
    for i := 0; i < 3; i++ {
        for j := 0; j < 3; j++ {
            if i == 1 && j == 1 {
                fmt.Println("ターゲット発見、全てのループを終了します。")
                break Loop
            }
            fmt.Printf("i:%d, j:%d\n", i, j)
        }
    }
}
実行結果
i:0, j:0
i:0, j:1
i:0, j:2
i:1, j:0
ターゲット発見、全てのループを終了します。

このように、while文がないことによる不便さは全くなく、むしろ洗練された代替手段が用意されているのがGo言語の特徴です。

まとめ

Go言語にwhile文がない理由は、言語の複雑さを排除し、誰が書いても同じような構造になるコードを目指した結果です。

「for」という単一のキーワードが、標準的なループ、条件式ループ、無限ループのすべてを担うことで、私たちはよりロジックそのものに集中できるようになりました。

今回の内容を振り返ると、while文の代用には「for 条件式 { … }」を使い、do-whileの再現には「for { … break }」を用いるのが基本パターンです。

さらに、スライスやマップの操作には for range を積極的に利用することで、Goらしい簡潔で安全なプログラムを記述できます。

このシンプルで力強い設計思想を理解すれば、Go言語での開発効率はさらに向上するはずです。

まずは手元のエディタで、今回紹介した様々なfor文のパターンを試してみてください。