【Go言語入門】for文ループの書き方と実践テクニックを徹底解説

2025年4月16日水曜日

Go言語

Go言語のfor文ループの基本的な使い方から応用テクニックまで、この記事一本でまるっと理解できるように解説していきます!

 プログラミングで同じような処理を何度も繰り返したいとき、ループ処理は欠かせない存在ですよね。Go言語では、ループはこの`for`文だけで色々な繰り返しができちゃうんです。

「えっ、for文だけで大丈夫なの?」と思ったそこの皆さん、心配いりません! Go言語の`for`文はとっても柔軟で、他の言語でいう`while`文みたいな書き方もできちゃいます。

この記事を読めば、Go言語のループ処理はマスターしたも同然! きっと「なるほど、こう書けばいいのか!」と膝を打つはずですよ。

この記事で学べること

  • Go言語のループ処理の基本
  • 色々な`for`文の書き方パターン
  • スライスやマップを扱う`for...range`の使い方
  • ループを途中で抜けたり、スキップしたりする方法 (`break`, `continue`)
  • ループ処理を書く上での注意点

さあ、Go言語の`for`文ループの世界へ飛び込んで、繰り返し処理を自由自在に操れるようになりましょう!


Go言語のfor文ループとは?繰り返し処理の基本を理解しよう

まず、プログラムにおける「ループ」や「繰り返し処理」って何でしょう?

簡単に言うと、コンピューターに同じような作業を何度もやってもらうための仕組みのことです。例えば、1から100まで数字を表示したり、リストに入っている全部のデータを取り出して何か処理したり、そんな時にループが活躍します。

Go言語の面白いところは、他の多くのプログラミング言語にあるような`while`文や`do-while`文といったループ専用の命令がなくて、ループ処理はすべて`for`文だけで書くという点です。

一見、不便に感じるかもしれませんが、実はGo言語の`for`文はすごく多機能で、書き方を変えるだけで色々なパターンの繰り返しに対応できるんですよ。

だから、覚えることが少なくて済む、とも言えますね! Go言語ではループはこの`for`文だけ覚えればOK!って考えると、ちょっと気が楽になりませんか?

Go言語の基本的なfor文ループの書き方

それでは、一番基本となる`for`文の形を見ていきましょう。多くのプログラミング言語経験者には馴染み深い形かもしれません。

基本的な`for`文は、セミコロン`;`で区切られた3つの部分で構成されています。

for 初期化ステートメント; 条件式; 後処理ステートメント {
    // 繰り返したい処理
}
  • 初期化ステートメント ループが始まる前に一度だけ実行されます。ループで使うカウンター変数をここで初期化することが多いです(例 `i := 0`)。
  • 条件式 ループを続けるかどうかを判断する式です。この式の結果が`true`である間、ループ内の処理が繰り返されます。`false`になったらループは終了します。
  • 後処理ステートメント ループ内の処理が一回終わるごとに実行されます。カウンター変数を増やしたり減らしたりする処理(例 `i++`)をよく書きます。

言葉だけだと分かりにくいので、実際のコードを見てみましょう。0から4までの数字を表示する簡単な例です。

書き方

package main

import "fmt"

func main() {
    for i := 0; i < 5; i++ {
        fmt.Println(i)
    }
}

ソースコードの表示結果

0
1
2
3
4

この例では、

  1. 最初に `i := 0` で変数 `i` を0で初期化します。
  2. 次に `i < 5` という条件をチェックします。最初は `0 < 5` なので `true` ですね。
  3. 条件が `true` なので、ループの中の `fmt.Println(i)` が実行され、`0` が表示されます。
  4. ループ内の処理が終わると、後処理ステートメント `i++` が実行され、`i` が `1` になります。
  5. 再び条件 `i < 5` をチェックします。`1 < 5` なので `true`。
  6. ループ内の処理 `fmt.Println(i)` が実行され、`1` が表示されます。
  7. 後処理 `i++` で `i` が `2` になります。

…これを `i` が `5` になるまで繰り返します。`i` が `5` になると、条件 `i < 5` が `false` になるため、ループは終了します。これが一番基本的な`for`文の動きです。

Go言語のfor文ループのさまざまな使い方

基本形を覚えたところで、次はGo言語の`for`文が持つ色々な顔を見ていきましょう。

書き方を変えるだけで、もっと便利な使い方ができるんです。ここでは代表的な3つのパターンを紹介しますね。

① 条件式のみのfor文 (while文のように使う)

Go言語の`for`文は、初期化ステートメントと後処理ステートメントを省略して、条件式だけでループさせることも可能です。これは他の言語の`while`文とそっくりな使い方になります。

書き方

for 条件式 {
    // 繰り返したい処理
    // 注意! ループ内で条件式がいつかfalseになるような処理を入れないと無限ループになります
}

例えば、変数 `n` が10未満の間だけ処理を繰り返したい、という場合に使えます。

ソースコード

package main

import "fmt"

func main() {
    n := 0
    for n < 3 { // nが3未満の間だけループ
        fmt.Println("現在のn:", n)
        n++ // nを1増やす (これを忘れると無限ループ!)
    }
    fmt.Println("ループ終了!")
}

ソースコードの表示結果

現在のn: 0
現在のn: 1
現在のn: 2
ループ終了!

このように、特定の条件が満たされている間だけ処理を繰り返したい場合に便利です。ループ内で条件が変わるような処理(例の`n++`)を忘れないように気をつけてくださいね。

② for...rangeを使ったループ (スライス、マップ、文字列の反復処理)

Go言語で配列やスライス、マップといった複数の要素を持つデータ構造の中身を順番に取り出したい時、`for...range`構文がめちゃくちゃ便利です! コードがすっきりして読みやすくなりますよ。

基本的な書き方

for インデックス, 値 := range データ構造 {
    // インデックスと値を使った処理
}

`range`の後ろに、繰り返したいデータ構造(スライス、マップ、文字列など)を指定します。ループの各回で、`インデックス`(スライスなら要素番号、マップならキー)と、`値`(要素そのもの)が変数にセットされます。

スライスの場合

package main

import "fmt"

func main() {
    fruits := []string{"りんご", "ばなな", "みかん"}
    for i, fruit := range fruits {
        fmt.Printf("インデックス: %d, 値: %s\n", i, fruit)
    }
}

ソースコードの表示結果

インデックス: 0, 値: りんご
インデックス: 1, 値: ばなな
インデックス: 2, 値: みかん

インデックス(番号)が必要ない場合は、`_`(ブランク識別子)を使って無視できます。

    for _, fruit := range fruits { // インデックスは使わない
        fmt.Println("値:", fruit)
    }

マップの場合

package main

import "fmt"

func main() {
    scores := map[string]int{
        "国語": 80,
        "数学": 95,
        "英語": 70,
    }
    for subject, score := range scores {
        fmt.Printf("キー: %s, 値: %d\n", subject, score)
    }
}

ソースコードの表示結果 (マップの順番は実行ごとに変わることがあります)

キー: 国語, 値: 80
キー: 数学, 値: 95
キー: 英語, 値: 70

`for...range`はGo言語のループ処理で非常によく使われる書き方なので、ぜひマスターしておきましょう!

③ 無限ループとその意図的な使い方

条件式すら省略すると、`for`文は無限ループになります。つまり、永遠に止まらないループです。

書き方

for {
    // 永遠に繰り返したい処理
    // (通常はループを抜けるための条件と break 文が必要)
}

「え、無限ループなんてバグの元じゃないの?」と思うかもしれません。確かに、意図せず無限ループを作ってしまうのは問題です。しかし、プログラムによっては、意図的に無限ループを使う場面があります。

例えば、

  • Webサーバーが外部からのリクエストを待ち受け続ける
  • バックグラウンドで定期的に何かをチェックし続ける

といった処理です。このような場合、プログラムが動いている間はずっと処理を続けてほしいので、無限ループが使われます。もちろん、無限ループの中には、特定の条件になったらループを終了させるための`break`文(後で説明します)を入れるのが一般的です。

ソースコード (意図的に止める例)

package main

import (
    "fmt"
    "time"
)

func main() {
    count := 0
    for { // 無限ループ開始
        fmt.Println("ループ中...")
        time.Sleep(1 * time.Second) // 1秒待つ
        count++
        if count >= 3 {
            fmt.Println("ループを抜けます!")
            break // countが3以上になったらループを抜ける
        }
    }
    fmt.Println("プログラム終了")
}

ソースコードの表示結果

ループ中...
ループ中...
ループ中...
ループを抜けます!
プログラム終了

無限ループは強力ですが、使い方を間違えるとプログラムが応答しなくなることもあるので、注意して使いましょう。

Go言語のfor文ループ制御 - breakとcontinueを使いこなす

ループ処理を書いていると、「途中でループを抜けたい!」とか「今回は処理をスキップして次に行きたい!」と思うことがありますよね。

そんな時に活躍するのが`break`文と`continue`文です。ループの流れを柔軟にコントロールできるようになりますよ。

break - ループ処理を中断する

`break`文を使うと、その時点でループ全体を強制的に終了させることができます。ループの中に`break`文があると、それが実行された瞬間にループから抜け出して、ループの次の処理に進みます。

よく使われるのは、配列やスライスの中から特定の要素を探していて、見つかったらそれ以上探す必要がない、といった場面です。

ソースコード

package main

import "fmt"

func main() {
    numbers := []int{1, 5, 10, 15, 20}
    target := 10

    fmt.Printf("%d を探します...\n", target)
    for _, num := range numbers {
        fmt.Printf("チェック中: %d\n", num)
        if num == target {
            fmt.Println("見つけました!")
            break // 見つかったのでループを抜ける
        }
    }
    fmt.Println("探索処理終了。")
}

ソースコードの表示結果

10 を探します...
チェック中: 1
チェック中: 5
チェック中: 10
見つけました!
探索処理終了。

`num`が`10`になった時点で`break`が実行され、`15`や`20`はチェックされずにループが終了しているのが分かりますね。不要な処理を省略できるので効率的です。

continue - 現在のイテレーションをスキップする

`continue`文は、ループを完全に終了させる`break`とは違い、現在の回の処理だけを中断して、すぐに次の回の処理(次のイテレーション)に進ませる命令です。

例えば、リストの中の奇数だけを処理したい(偶数はスキップしたい)場合などに使えます。

ソースコード

package main

import "fmt"

func main() {
    numbers := []int{1, 2, 3, 4, 5}

    fmt.Println("奇数だけ表示します:")
    for _, num := range numbers {
        if num%2 == 0 { // 偶数かどうかチェック
            continue // 偶数なら、この回の残りの処理をスキップして次へ
        }
        // 奇数の場合だけここが実行される
        fmt.Println(num)
    }
    fmt.Println("処理終了。")
}

ソースコードの表示結果

奇数だけ表示します:
1
3
5
処理終了。

`num`が`2`や`4`(偶数)のときは、`if num%2 == 0`が`true`になり、`continue`が実行されます。

すると、その下にある`fmt.Println(num)`は実行されずに、すぐに次の`num`(`3`や`5`)の処理に移ります。特定の条件の時だけ処理を飛ばしたい場合に有効ですね。

Go言語のfor文ループ利用時の注意点とTips

`for`文ループは便利ですが、いくつか気をつけたい点や、知っておくと良いコツがあります。初心者のうちにつまずきやすいポイントでもあるので、チェックしておきましょう!

無限ループに注意!

特に条件式のみの`for`文や無限ループを使う場合、ループから抜け出す条件(`break`など)をちゃんと設定しないと、プログラムが止まらなくなってしまいます。ループの条件式や、ループ内での変数の変化をよく確認しましょう。

`for...range`での変数スコープ

`for...range`で宣言したインデックス変数や値変数は、ループの中だけで有効です。ループの外からアクセスすることはできません。

また、少し高度な話になりますが、`range`で使う値変数はループの各回で同じメモリ領域が使い回されることがあるため、ループ内で変数のアドレスを使う場合は注意が必要です。(最初はあまり気にしすぎなくても大丈夫ですが、頭の片隅に置いておくと良いかもしれません)

ループ中のスライスやマップの変更

`for...range`でスライスやマップをループ処理している最中に、そのスライスやマップの要素を追加したり削除したりすると、予期せぬ動きをすることがあります。

基本的には、ループ処理中に元のデータ構造を変更するのは避けた方が安全です。もし変更が必要な場合は、別の方法を考えるか、挙動をよく理解した上で慎重に行いましょう。

ネストしたループでの`break`/`continue`

ループの中にさらにループがある(ネストしている)場合、内側のループで`break`や`continue`を使っても、影響するのはその内側のループだけです。

外側のループまで抜けたい場合は、「ラベル付き`break`」という少し発展的な機能を使う必要があります。(まずは`break`/`continue`の基本をしっかり押さえましょう!)

これらの点に気をつけるだけで、より安全で意図した通りのループ処理が書けるようになりますよ。

【まとめ】Go言語のfor文で繰り返し処理を自在に操ろう!

今回はGo言語の`for`文ループについて、基本から応用まで一通り見てきましたね。

ポイントを振り返ってみましょう。

  • Go言語のループ処理は`for`文だけで色々なパターンが書ける!
  • 基本形は「初期化; 条件式; 後処理」
  • 条件式だけで`while`文のように使える
  • `for...range`でスライスやマップの要素を簡単に取り出せる
  • `for {}`で意図的な無限ループも作れる
  • `break`でループを中断、`continue`で現在の回をスキップできる

Go言語の`for`文は、シンプルながらも非常に強力で、プログラムを書く上でなくてはならない存在です。今回学んだことを元に、ぜひご自身で色々なコードを書いて、`for`文ループの使い方に慣れていってください。

繰り返し処理をマスターすれば、書けるプログラムの幅がぐっと広がります。自信を持ってGo言語のコーディングを楽しんでいきましょう!

【関連記事】 Go言語とは?特徴・できること・将来性

このブログを検索

  • ()

自己紹介

自分の写真
リモートワークでエンジニア兼Webディレクターとして活動しています。プログラミングやAIなど、日々の業務や学びの中で得た知識や気づきをわかりやすく発信し、これからITスキルを身につけたい人にも役立つ情報をお届けします。 note → https://note.com/yurufuri X → https://x.com/mnao111

QooQ