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) }