Go の繰り返し構文には for しかない。だけどこの for には 3 通りの使い方があって、ひとつは普通の for、ひとつは while 的なもの、そしてもひとつはいわゆる for each 的なものだ。
順番に見ていこう。
まずひとつめ、普通の for。「普通の」というのは、繰り返し用変数の初期化と繰り返し条件、変数の更新処理がある C や JavaScript なんかと同じ、くらいの意味。ただしカッコは要らない。
package main
import "fmt"
func main() {
names := []string{ "Andy", "Bill", "Charlie" }
for i := 0; i < 3; i++ {
fmt.Println(names[i])
}
}
names := []string{ "Andy", "Bill", "Charlie" } というところは、スライスっていう配列みたいなものを作ってるんだけど、これについては別の機会に書く。
実行してみよう。
^o^ > go run for.go Andy Bill Charlie
ふたつめの使い方は while のようなもの。というか while そのものだ。for の後に繰り返し条件だけを書く。
package main
import "fmt"
func main() {
names := []string{ "Andy", "Bill", "Charlie" }
i := 0
for i < 3 {
fmt.Println(names[i])
i++
}
}
^o^ > go run for_while.go Andy Bill Charlie
最後はいわゆる for each 的な使い方。range キーワードを使って、スライス(または配列)のインデックスと要素を一つずつ取り出して繰り返す。
package main
import "fmt"
func main() {
names := []string{ "Andy", "Bill", "Charlie" }
for idx, name := range names {
fmt.Println(idx, name)
}
}
^o^ > go run for_range.go 0 Andy 1 Bill 2 Charlie
ここではインデックスを idx 変数で受け取っているけど、場合によっては使わないこともある。そういう時は次のように _ (アンダースコア)で受けてやる。そうしないと idx 変数を使っていない、という警告を受けることになる。アンダースコアは、「ここに入る値は使わないよ」ということを示すものだ。
for _, name := range names {
fmt.Println(name)
}