Go言語のcontinueを使ってループの次の反復へスキップする方法についてわかりやすく解説

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

continueの概要

ループの制御 Goの予約語

continue

概要continueは、ループ内で使用され、現在の反復処理をスキップして次の反復に進むためのキーワードです。

  • 現在のループ処理を途中で終了し、次の反復へ進む。
  • forループの中で使用可能。
  • 条件に応じて一部の処理をスキップする際に便利。

基本的なcontinueの使い方

continueを使って偶数だけを出力する例です。

package main

import "fmt"

func main() {
    for i := 1; i <= 10; i++ {
        if i%2 != 0 {
            continue // 奇数ならスキップ
        }
        fmt.Println(i)
    }
}

解説:

  • if i%2 != 0(奇数の場合)にcontinueを実行し、そのループの残りの処理をスキップ。
  • 結果として偶数のみが出力される。

実行結果:

2
4
6
8
10

特定の条件で処理をスキップ

特定の条件に該当する場合のみ処理をスキップし、それ以外は通常の処理を行う例です。

package main

import "fmt"

func main() {
    for i := 1; i <= 5; i++ {
        if i == 3 {
            fmt.Println("3はスキップ")
            continue
        }
        fmt.Println("処理中:", i)
    }
}

解説:

  • if i == 3 の条件が満たされた場合、continueで処理をスキップ。
  • 「3はスキップ」と表示され、その後のfmt.Println("処理中:", i)は実行されない。

実行結果:

処理中: 1
処理中: 2
3はスキップ
処理中: 4
処理中: 5

ネストしたループでcontinueを使用

ネストされたループ(多重ループ)でcontinueを使うと、内側のループのみをスキップします。

package main

import "fmt"

func main() {
    for i := 1; i <= 3; i++ {
        for j := 1; j <= 3; j++ {
            if j == 2 {
                continue // j == 2 のときスキップ
            }
            fmt.Println(i, j)
        }
    }
}

解説:

  • 内側のループでj == 2の場合、continueが実行され、fmt.Println(i, j)がスキップされる。
  • 外側のループ(iのループ)は影響を受けない。

実行結果:

1 1
1 3
2 1
2 3
3 1
3 3

ラベル付きcontinue(外側のループをスキップ)

通常のcontinueは内側のループのみをスキップしますが、ラベルを付けることで外側のループをスキップできます。

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

注意事項

  • continueは現在のループのみスキップ: 外側のループには影響しない。
  • ラベル付きcontinueを使うと外側のループをスキップ可能: ただし、過度に使用するとコードの可読性が低下する。
  • 無限ループに注意: continueを誤って使用すると、条件によっては無限ループになる可能性がある。

よくある質問

Q: continueとbreakの違いは何ですか?
A: continueは現在のループの反復をスキップし、次の反復に進みます。一方、breakはループ自体を終了します。
Q: continueをif文なしで使うことはできますか?
A: 可能ですが、通常は条件を指定せずにcontinueを使うと、全ての反復がスキップされてしまい意味がありません。
Q: continueを使わずに同じ動作を実現する方法はありますか?
A: はい。if文の中に実行すべき処理を書かずにreturnelseを使うことで、continueを使わずにスキップ処理を実現できます。
Q: continueを多用するとコードの可読性に影響しますか?
A: はい。多用すると処理の流れが分かりづらくなるため、適切に使用することが重要です。
Q: ラベル付きcontinueとgotoの違いは何ですか?
A: continueはループの次の反復へ移りますが、gotoはコードの指定したラベルへ無条件でジャンプします。continueの方が安全で可読性も高いです。

まとめ

  • continueは現在のループの残りの処理をスキップし、次の反復へ進む。
  • 特定の条件を満たした場合にのみ処理をスキップするのに便利。
  • ネストしたループでは、内側のループの処理のみをスキップする。
  • ラベル付きcontinueを使うと、外側のループをスキップできる。
  • 過度な使用はコードの可読性を下げるため、適切に利用することが重要。