Go言語のforを使ってループ処理を行う方法についてわかりやすく解説

スポンサーリンク
スポンサーリンク

forの概要

ループ処理 Goの予約語

for

概要forは、Goの唯一のループ構文であり、条件を満たす間繰り返し処理を実行できます。

  • forループは、条件が満たされる限り処理を繰り返す。
  • Goにはwhileループがなく、すべてのループはforで実装される。
  • 繰り返し処理の終了条件を適切に設定しないと、無限ループになる可能性がある。

基本的なforループの使い方

forループを使って、1から5までの数値を出力する基本的な例です。

package main

import "fmt"

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

解説:

  • i := 1 で初期化し、i <= 5 の条件が成り立つ間ループを実行。
  • 各ループの最後に i++iを1増やす。

実行結果:

1
2
3
4
5

whileのように使うforループ

Goにはwhileが存在しないため、条件のみを指定するforを使ってwhileのようなループを実現できます。

package main

import "fmt"

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

解説:

  • 初期値i := 1をループの外で定義。
  • 終了条件i <= 5のみを指定して、条件が満たされる間ループを実行。

実行結果:

1
2
3
4
5

無限ループ

Goでは、forの後に何も書かないと無限ループになります。

package main

import "fmt"

func main() {
    count := 0
    for {
        fmt.Println("無限ループ")
        count++
        if count == 3 {
            break // 3回で終了
        }
    }
}

解説:

  • forの後に条件がないため、無限ループになる。
  • breakを使って、ループを手動で抜ける。

実行結果:

無限ループ
無限ループ
無限ループ

rangeを使ったforループ

forrangeを組み合わせると、スライスやマップの要素を簡単にループできます。

package main

import "fmt"

func main() {
    numbers := []int{10, 20, 30, 40}

    for index, value := range numbers {
        fmt.Printf("インデックス: %d, 値: %d\n", index, value)
    }
}

解説:

  • range numbersを使うと、スライスの各要素を順番に処理できる。
  • indexにはインデックスが、valueには要素の値が入る。

実行結果:

インデックス: 0, 値: 10
インデックス: 1, 値: 20
インデックス: 2, 値: 30
インデックス: 3, 値: 40

ラベル付きforループ

ネストしたループで特定のループを制御するために、ラベルを付けてbreakcontinueを使うことができます。

package main

import "fmt"

func main() {
OuterLoop:
    for i := 1; i <= 3; i++ {
        for j := 1; j <= 3; j++ {
            if j == 2 {
                continue OuterLoop // 外側のループの次の反復へ
            }
            fmt.Println(i, j)
        }
    }
}

解説:

  • continue OuterLoopを実行すると、外側のforループの次の反復に移る。
  • j == 2のとき、内側のループだけでなく外側のループの次の反復へ進む。

実行結果:

1 1
2 1
3 1

注意事項

  • 無限ループに注意: 条件を設定しないとループが永遠に続く可能性がある。
  • Goにはwhileがない: 代わりに条件式のみのforを使用する。
  • ネストが深くなると可読性が低下: ラベル付きforを使いすぎるとコードが複雑になる。

よくある質問

Q: Goにはwhileループがないのですか?
A: はい。Goにはwhileキーワードはなく、forのみを使ってすべてのループを表現します。forの条件部分を省略すると、whileと同様の動作が可能です。
Q: forループのインクリメント部分を省略できますか?
A: はい。for ; 条件 ; { ... } のように書くことで、ループ変数の増減を手動で管理できます。
Q: for文のスコープはどうなりますか?
A: ループ変数はそのforブロック内でのみ有効です。ループ外でアクセスするとコンパイルエラーになります。
Q: rangeでループする際にインデックスが不要な場合はどうしますか?
A: for _, value := range slice のようにアンダースコア(_)を使ってインデックスを無視できます。
Q: ラベル付きforループはどんな場合に使うべきですか?
A: 深くネストしたループを途中で抜ける必要がある場合に使うと便利ですが、多用すると可読性が下がるため注意が必要です。

まとめ

  • forはGoで唯一のループ構文であり、whileのようにも使用できる。
  • 初期化、条件、更新の3つの部分を持つ標準的なforループを使用できる。
  • 条件のみを指定することで、whileのようなループを作成できる。
  • 無限ループを作るにはfor {}を使用し、適切な条件でbreakを入れる。
  • rangeを使うと、スライスやマップを簡単に反復処理できる。
  • ラベルを使うと、ネストしたループを制御できるが、可読性が低下するため注意が必要。