繰り返し(for文)

for文は繰り返し処理を制御する手段です。

for文の書き方

キーワードforを使って繰り返し処理を記述します。 基本形は次の通りです。

for 初期化文; 条件式; 後処理文 {
    処理
}
  • 初期化文:最初に1度だけ実行
  • 条件式:各処理の前に実行、条件が偽の場合は繰り返しを終了
  • 後処理文:各処理の後に実行

サンプルコードは次の通りです。

for i := 0; i < 3; i++ {
    fmt.Println(i)
}
// 実行結果:
// 0
// 1
// 2

条件式のみを記載できます。 他のプログラミング言語のwhile文に相当します。

var i int
for i < 3 {
    fmt.Println(i)
    i += 1
}
// 実行結果:
// 0
// 1
// 2

条件式は省略できます。 for文を抜け出す処理を書かないと無限ループで処理が終了しないため、注意してください。

for {
    fmt.Println("infinite loop")
}

continue文

continue文で現在の処理を中断し、次の繰り返し処理を開始できます。

for i := 0; i < 5; i++ {
    fmt.Println("i:", i)
    // iが奇数の場合、次の繰り返しを開始
    if i % 2 == 1 {
        continue
    }
    // iが偶数の場合だけここを通る
    fmt.Println("even")
}
// 実行結果:
// i: 0
// even
// i: 1
// i: 2
// even

break文

break文で繰り返しを終了できます。

for i := 0; i < 5; i++ {
    fmt.Println("i:", i)
    // iが3の場合繰り返しを終了する
    if i == 3 {
        break
    }
}
// 実行結果:
// i: 0
// i: 1
// i: 2
// i: 3

range句

range句を使って、配列やスライスやマップの要素をひとつずつ処理できます。

// 配列
a := [2]int{1, 2}
// 1つ目の変数iは添字、2つ目の変数vは値
for i, v := range a {
    fmt.Println(i, v)
}
// 実行結果:
// 0 1
// 1 2

// スライス
s := []int{2, 3}
// 1つ目の変数iは添字、2つ目の変数vは値
for i, v := range s {
    fmt.Println(i, v)
}
// 実行結果:
// 0 2
// 1 3

// マップ
m := map[string]int{"a": 1, "b": 2}
// 1つ目の変数kはキー、2つ目の変数vは値
for k, v := range m {
    fmt.Println(k, v)
}
// 実行結果:
// a 1
// b 2

ラベル付き文

break文やcontinue文は一番近いfor文に対応しますが、入れ子のfor文の外側に抜けたい場合はラベル付き文を使います。 抜け出したいfor文の前にラベル名:の形式でラベルを表現します。 そして、break文でbreak ラベル名と書くことで、指定したラベル名があるスコープまで移動できます。

func main() {
LABEL1:
    for _, i := range []int{1, 2, 3} {
    LABEL2:
        for _, j := range []int{4, 5, 6} {
            fmt.Println(i, j)
            if i == 1 {
                break LABEL2
            }
            if j == 5 {
                break LABEL1
            }
        }
        // "break LABEL2"により、ここに移動する
    }
    // "break LABEL1"により、ここに移動する
}
// 実行結果:
// 1 4
// 2 4
// 2 5