forの概要
| ループ処理 Goの予約語 | ||
|
for 概要 |
||
|
基本的なforループの使い方
forループを使って、1から5までの数値を出力する基本的な例です。
package main
import "fmt"
func main() {
for i := 1; i <= 5; i++ {
fmt.Println(i)
}
}
解説:
i := 1で初期化し、i <= 5の条件が成り立つ間ループを実行。- 各ループの最後に
i++でiを1増やす。
実行結果:
1 2 3 4 5
whileのように使うforループ
Goにはwhileが存在しないため、条件のみを指定するforを使ってwhileのようなループを実現できます。
package main
import "fmt"
func main() {
i := 1
for i <= 5 {
fmt.Println(i)
i++
}
}
解説:
- 初期値
i := 1をループの外で定義。 - 終了条件
i <= 5のみを指定して、条件が満たされる間ループを実行。
実行結果:
1 2 3 4 5
無限ループ
Goでは、forの後に何も書かないと無限ループになります。
package main
import "fmt"
func main() {
count := 0
for {
fmt.Println("無限ループ")
count++
if count == 3 {
break // 3回で終了
}
}
}
解説:
forの後に条件がないため、無限ループになる。breakを使って、ループを手動で抜ける。
実行結果:
無限ループ 無限ループ 無限ループ
rangeを使ったforループ
forとrangeを組み合わせると、スライスやマップの要素を簡単にループできます。
package main
import "fmt"
func main() {
numbers := []int{10, 20, 30, 40}
for index, value := range numbers {
fmt.Printf("インデックス: %d, 値: %d\n", index, value)
}
}
解説:
range numbersを使うと、スライスの各要素を順番に処理できる。indexにはインデックスが、valueには要素の値が入る。
実行結果:
インデックス: 0, 値: 10 インデックス: 1, 値: 20 インデックス: 2, 値: 30 インデックス: 3, 値: 40
ラベル付きforループ
ネストしたループで特定のループを制御するために、ラベルを付けてbreakやcontinueを使うことができます。
package main
import "fmt"
func main() {
OuterLoop:
for i := 1; i <= 3; i++ {
for j := 1; j <= 3; j++ {
if j == 2 {
continue OuterLoop // 外側のループの次の反復へ
}
fmt.Println(i, j)
}
}
}
解説:
continue OuterLoopを実行すると、外側のforループの次の反復に移る。j == 2のとき、内側のループだけでなく外側のループの次の反復へ進む。
実行結果:
1 1 2 1 3 1
注意事項
- 無限ループに注意: 条件を設定しないとループが永遠に続く可能性がある。
- Goにはwhileがない: 代わりに条件式のみの
forを使用する。 - ネストが深くなると可読性が低下: ラベル付き
forを使いすぎるとコードが複雑になる。
よくある質問
- Q: Goにはwhileループがないのですか?
- A: はい。Goには
whileキーワードはなく、forのみを使ってすべてのループを表現します。forの条件部分を省略すると、whileと同様の動作が可能です。 - Q: forループのインクリメント部分を省略できますか?
- A: はい。
for ; 条件 ; { ... }のように書くことで、ループ変数の増減を手動で管理できます。 - Q: for文のスコープはどうなりますか?
- A: ループ変数はその
forブロック内でのみ有効です。ループ外でアクセスするとコンパイルエラーになります。 - Q: rangeでループする際にインデックスが不要な場合はどうしますか?
- A:
for _, value := range sliceのようにアンダースコア(_)を使ってインデックスを無視できます。 - Q: ラベル付きforループはどんな場合に使うべきですか?
- A: 深くネストしたループを途中で抜ける必要がある場合に使うと便利ですが、多用すると可読性が下がるため注意が必要です。
まとめ
forはGoで唯一のループ構文であり、whileのようにも使用できる。- 初期化、条件、更新の3つの部分を持つ標準的な
forループを使用できる。 - 条件のみを指定することで、
whileのようなループを作成できる。 - 無限ループを作るには
for {}を使用し、適切な条件でbreakを入れる。 rangeを使うと、スライスやマップを簡単に反復処理できる。- ラベルを使うと、ネストしたループを制御できるが、可読性が低下するため注意が必要。