1. はじめに
この記事でわかること:
- Goの
forの書き方は大きく3パターン -
breakとcontinueの使いどころ -
rangeの基本(配列・map) - ラベル付き for の挙動
2. 無限ループ(for { })
for {} は無限ループです。break で抜けます。
i := 0
for {
i++
fmt.Println(i) // 1 → 2 → 3
if i == 3 {
break
}
}
実行イメージ(出力)
1
2
3
3. 条件付きループ(while風)
Goには while がない代わりに、こう書きます。
point := 1
for point < 10 {
fmt.Println(point) // 1, 2, 3, ... 9
point++
}
ポイント
-
for 条件 {}が while 相当 -
()は不要、{}は必須
4. 3要素for(初期化; 条件; 更新)
もっとも一般的なforです。
for i := 0; i < 10; i++ {
fmt.Println(i) // 0〜9
}
5. break / continue の基本
continue(次のループへ)
for i := 0; i < 10; i++ {
if i == 3 {
fmt.Println(3) // 3
continue
}
fmt.Println(i) // 0,1,2,4,5,6,7,8,9
}
break(ループを抜ける)
for i := 0; i < 100; i++ {
if i > 30 {
fmt.Println("抜けた") // 抜けた
break
}
}
6. 配列を for で回す(index指定)
arr := [3]int{1, 2, 3}
for i := 0; i < len(arr); i++ {
fmt.Println(i, arr[i])
}
出力
0 1
1 2
2 3
7. range(配列 / スライス)
arr := [3]int{1, 2, 3}
for i, v := range arr {
fmt.Println(i, v)
}
出力
0 1
1 2
2 3
index が不要なら _ を使う
for _, v := range arr {
fmt.Println(v) // 1 → 2 → 3
}
8. range(map)
mapも range で回せます。
m := map[string]int{"apple": 100, "banana": 200}
for k, v := range m {
fmt.Println(k, v) // 順序は不定
}
ポイント
-
mapは毎回同じ順で出るとは限りません
キーだけ / 値だけも可能です。
for k := range m {
fmt.Println(k) // apple or banana(順序不定)
}
for _, v := range m {
fmt.Println(v) // 100 or 200(順序不定)
}
9. 2ずつ増やす(i += 2)
for i := 0; i < 10; i += 2 {
fmt.Println(i) // 0, 2, 4, 6, 8
}
10. ラベル付きfor(break / continue)
複数ループがネストしているとき、
「どのループを抜ける/続けるか」を指定したいことがあります。
そこで使うのがラベル付き forです。
10-1. ラベル付き break(外側まで一気に抜ける)
LOOP:
for {
for {
for {
fmt.Println("START") // START
break LOOP
}
fmt.Println("処理しない")
}
fmt.Println("処理しない")
}
fmt.Println("END") // END
出力
START
END
break LOOP により、ラベルのついたforまで一気に脱出します。
10-2. ラベル付き continue(外側の次の周へ)
LOOP2:
for i := 0; i <= 3; i++ {
for j := 1; j <= 3; j++ {
if j > 1 {
continue LOOP2
}
fmt.Println(i, j, i*j)
}
}
このコードは、j=1(つまり j=2,3)になった瞬間、
内側ではなく外側(LOOP2)の次の i へ進みます。
出力
0 1 0
1 1 1
2 1 2
3 1 3
参考