繰り返し(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