Go 速習チュートリアル

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
4

5. 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
2

6. ネストされたループ(入れ子)

ループの中に別のループを配置することも可能です。この場合、「外側のループ」のイテレーションが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)
  }
}