Go 言語の for ループ
1. for ループの基本
for ループは、指定された回数だけコードブロックを繰り返し実行するための制御構造です。Go言語において、反復処理(イテレーション)に使用できるループ構造は for ループのみです。
2. Go の for ループ構文
ループは、異なる値を使用して同じコードを繰り返し実行したい場合に非常に便利です。ループが1回実行されることを「イテレーション(iteration)」と呼びます。
for ループは、最大3つのステートメント(文)を引数として取ることができます。
2.1. シンタックス
for statement1; statement2; statement3 {
// 各イテレーションで実行されるコード
}- statement1: ループカウンタの値を初期化します。
- statement2: 各イテレーションの前に評価されます。
true(真)であればループを継続し、false(偽)であればループを終了します。 - statement3: ループカウンタの値を増加(または減少)させます。
注意: これらのステートメントは、必ずしもループの引数として記述する必要はありませんが、何らかの形でコード内に存在する必要があります。
3. for ループの実装例
3.1. 例1:0から4までの数値を出力
package main
import ("fmt")
func main() {
for i := 0; i < 5; i++ {
fmt.Println(i)
}
}解説:
i := 0;- ループカウンタ(i)を初期化し、開始値を0に設定します。i < 5;- iが 5 未満である限りループを継続します。i++- 各イテレーションの後に、ループカウンタの値を 1 増やします。
3.2. 例2:10刻みで100までカウント
package main
import ("fmt")
func main() {
for i := 0; i <= 100; i += 10 {
fmt.Println(i)
}
}4. continue ステートメント
continue ステートメントは、ループ内の現在のイテレーションをスキップし、次のイテレーションへと進むために使用されます。
4.1. 実装例(3の値をスキップする)
package main
import ("fmt")
func main() {
for i := 0; i < 5; i++ {
if i == 3 {
continue
}
fmt.Println(i)
}
}実行結果:
0
1
2
45. break ステートメント
break ステートメントは、ループの実行を強制的に中断(終了)するために使用されます。
5.1. 実装例(iが3の時にループを抜ける)
package main
import ("fmt")
func main() {
for i := 0; i < 5; i++ {
if i == 3 {
break
}
fmt.Println(i)
}
}実行結果:
0
1
26. ネストされたループ(入れ子)
ループの中に別のループを配置することも可能です。この場合、「外側のループ」のイテレーションが1回実行されるたびに、「内側のループ」が完全に実行されます。
6.1. 実装例
package main
import ("fmt")
func main() {
adj := [2]string{"大きな", "美味しい"}
fruits := [3]string{"りんご", "オレンジ", "バナナ"}
for i := 0; i < len(adj); i++ {
for j := 0; j < len(fruits); j++ {
fmt.Println(adj[i], fruits[j])
}
}
}7. range キーワード
range キーワードを使用すると、配列(array)、スライス(slice)、またはマップ(map)の要素をより簡単に走査(イテレート)できます。これは各要素のインデックスと値の両方を返します。
7.1. シンタックス
for index, value := range array|slice|map {
// 各イテレーションで実行されるコード
}7.2. range の実装例
配列を走査して、各要素のインデックス(idx)と値(val)を出力する例です。
package main
import ("fmt")
func main() {
fruits := [3]string{"りんご", "オレンジ", "バナナ"}
for idx, val := range fruits {
fmt.Printf("%v\t%v\n", idx, val)
}
}8. ブランク識別子 (_) による出力の省略
特定の戻り値(インデックスまたは値のいずれか)のみを必要とする場合、アンダースコア(_)を使用することで、もう一方の出力を省略できます。
8.1. インデックスを省略する場合
package main
import ("fmt")
func main() {
fruits := [3]string{"りんご", "オレンジ", "バナナ"}
for _, val := range fruits {
fmt.Printf("%v\n", val)
}
}8.2. 値を省略する場合
package main
import ("fmt")
func main() {
fruits := [3]string{"りんご", "オレンジ", "バナナ"}
for idx, _ := range fruits {
fmt.Printf("%v\n", idx)
}
}