Go/continue
Goにおける continue キーワードは、for ループの中で使用され、現在のイテレーションの残りの処理をスキップし、次のイテレーションを直ちに開始させるために使用されます。continue が実行されると、ループ内の continue 文以降のコードは実行されず、ループの制御は後処理ステートメント(存在する場合)に進み、そして次のループ条件の評価が行われます。
continue は、特定の条件を満たす場合に、そのイテレーションの残りの処理を省略して次の要素に移りたい場合に便利です。
- Cスタイルの
forループ (for initialization; condition; post):continueが実行されると、まずpostステートメント(通常はカウンタのインクリメントなど)が実行され、その後conditionが評価されます。 range句を用いたforループ (for index, value := range collection):continueが実行されると、現在のイテレーションの残りの処理はスキップされ、次の要素のインデックスと値が取得され、ループが継続されます。
- 例1
- Cスタイルの
forループ package main import "fmt" func main() { for i := 0; i < 5; i++ { if i == 2 { continue // i が 2 の場合は残りの処理をスキップして次のイテレーションへ } fmt.Println(i) } }
この例では、i が 2 の場合、fmt.Println(i) は実行されずに continue が実行されます。その後、i はインクリメントされ(i++)、次のイテレーションが始まります。出力は以下のようになります。
0 1 3 4
- 例2
range句を用いたforループ (スライス)package main import "fmt" func main() { numbers := []int{1, 2, 3, 4, 5} for index, value := range numbers { if value%2 == 0 { continue // 偶数の場合は残りの処理をスキップ } fmt.Printf("Index: %d, Value: %d (奇数)\n", index, value) } }
この例では、スライス numbers の要素が偶数の場合、continue が実行され、その要素に対する fmt.Printf は実行されません。出力は以下のようになります。
Index: 0, Value: 1 (奇数) Index: 2, Value: 3 (奇数) Index: 4, Value: 5 (奇数)
break と同様に、continue もラベルと組み合わせて使用することで、より外側のループの次のイテレーションを開始させることができます。
package main import "fmt" func main() { outerLoop: for i := 0; i < 3; i++ { for j := 0; j < 3; j++ { if i == 1 && j == 1 { fmt.Println("continue outerLoop at i =", i, ", j =", j) continue outerLoop // outerLoop の次のイテレーションへ } fmt.Printf("i = %d, j = %d\n", i, j) } } }
この例では、i が 1 で j が 1 の場合、内側のループの continue outerLoop が実行され、外側のループ (outerLoop) の次のイテレーション(i が 2)が開始されます。内側のループの残りの処理はスキップされます。出力は以下のようになります。
i = 0, j = 0 i = 0, j = 1 i = 0, j = 2 i = 1, j = 0 continue outerLoop at i = 1 , j = 1 i = 2, j = 0 i = 2, j = 1 i = 2, j = 2
まとめ
[編集]continue キーワードは、Goの for ループ内で、特定の条件に基づいて現在のイテレーションの残りの処理をスキップし、効率的に次のイテレーションに進むための重要な制御フローツールです。ラベル付き continue を使用することで、より複雑なネストされたループ構造においても、意図した制御を行うことができます。