for文

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