ループは、どのプログラミング言語でも必要不可欠な要素です。本記事では、Goのforループをより深く掘り下げていきます。
Golangのforループの構文
forループは、プログラミングで最もよく使われるループの1つであり、ほとんどすべての言語で使用されています。
Golangのforループは他の言語と同じように動作します。
ループは for というキーワードで始まり、ループする変数を初期化し、条件をパスし、後条件を実行します。
以下は、Golangのforループの構文です。
for 初期化; 条件; 後条件 {
// 処理
}
forループの宣言
forループの宣言と使い方を説明します。実際の構文がどのように書かれるかを知れば、簡単に理解できると思います。
以下は、forループを実際に使用する例です。
package main
import (
"fmt"
)
func main() {
for i := 0; i < 5; i++ {
fmt.Println("Hello")
}
}
//出力結果
// Hello
// Hello
// Hello
// Hello
// Hello
上のコードでは変数iが初期化され、条件に合致するかを確かめます。
この後、変数iの値を1だけ増加させるという後件があります。
このインクリメントは、ループを前進させるステップのメカニズムです。
無限ループ
無限ループを作成することもできます。条件節を削除するだけで、無限ループになります。
以下は、無限ループの構文です。
for {
// このブロック内の処理が無限に続く
}
ある条件に合致した後に無限実行を止めるために、Golangにはbreakというキーワードがあり、これを使うとループから抜け出すことができます。
条件付きforループ文
初期化条件と後条件を除くだけで、別の種類のforループ、つまり条件付きforループを作成することができます。
これは条件をチェックし、マッチした場合にのみ実行されます。
例えば、次のようなものである。
package main
import (
"fmt"
)
func main() {
i := 0
for i<7 {
fmt.Println(i)
i += 2
}
}
// 出力結果
// 0
// 2
// 4
// 6
上記の例だとi<7の部分が条件となり、iが7未満であるなら、for文のブロック内の処理が実行されます。
range forループ
スライスや配列の要素に対して反復処理を行う場面があります。(JavaScript等で言う、forEach文の処理)
そのような場合は、forと一緒にrange関数を使うことができます。
以下は、range-forループの実行例です。
package main
import (
"fmt"
)
func main() {
var numbers []int = []int{1, 2, 3, 4, 5}
for i, v := range numbers {
fmt.Println(i, v)
}
}
// 出力結果
// 0 1
// 1 2
// 2 3
// 3 4
// 4 5
range-forは、現在のインデックス番号と現在の値の2つを扱うことができます。
もし現在の値だけが必要なら、空白の識別子を使ってインデックス番号を無視することができます。
package main
import (
"fmt"
)
func main() {
var numbers []int = []int{1, 2, 3, 4, 5}
for _, v := range numbers {
fmt.Println(v)
}
}
// 出力結果
// 1
// 2
// 3
// 4
// 5
map(連想配列)を使ったrange-for文
range-forはmap(連想配列)でも使用できます。mapでのrange-for文はkeyとvalueの両方を同時に提供します。
keyはインデックスとなるため、コードの記述量を大幅に削減し、より簡潔なコードにすることができます。
以下は、マップでのrange-forの使い方を示すコード例です。
package main
import (
"fmt"
)
func main() {
var sampleMap map[int]string = map[int]string{
1: "Tanaka",
2: "Shimizu",
3: "Kato",
}
for k, v := range sampleMap {
fmt.Println(k, v)
}
}
// 出力結果
// 1 Tanaka
// 2 Shimizu
// 3 Kato
ネストされたforループ
Goのループは任意にネストすることができます。ここでは2つのforループを入れ子にしています。
package main
import (
"fmt"
)
func main() {
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
fmt.Println(i, j)
}
}
}
// 出力結果
// 0 0
// 0 1
// 0 2
// 1 0
// 1 1
// 1 2
// 2 0
// 2 1
// 2 2
forループでラベルを使う
進行中のループから抜け出すために、ラベルを使うことができます。
必要なのは、コードの意図するかたまりを指すラベルを作成することです。
以下はラベルを使用したコード例です。
package main
import (
"fmt"
)
func main() {
samoleLavel: // ラベルの定義
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if i < j {
break samoleLavel // ラベルを抜ける
}
fmt.Println(i, j)
}
}
}
// 出力結果 0 0
forループのcontinue文
continueは、コードのセグメントをスキップして、強制的に次の反復処理に移行させるためのキーワードです。
以下は、Golangのcontinue文の使い方を示す例です。
package main
import (
"fmt"
)
func main() {
for i := 0; i < 2; i++ {
for j := 0; j < 2; j++ {
if i < j {
continue
}
fmt.Println(i, j)
}
}
}
// 出力結果
// 0 0
// 1 0
// 1 1
// 2 0
// 2 1
// 2 2
上記の例だとi < jの結果がtrueの場合、continueによって次のループ周へと移ります。