まくまくGo言語ノート
for によるループ処理
2017-08-31
Go 言語では、for キーワード 1 つだけで while ループや無限ループを表現することができます。

C/C++ 言語風の for ループ

for 初期化; 条件式; 後処理 {
	// ...
}

Go 言語の for ループは、C/C++ 言語に似た構文を使用しますが、for の直後は括弧で囲みません。 ただし、実行部分の括弧は必ず記述する必要があります。 このあたりのルールは、if 文と同じですね。

記述例

for i := 0; i < 3; i++ {
	fmt.Println(i)
}

実行結果

0
1
2

ちなみに、i++ という部分を、++i という前置インクリメントに置き換えることはできません。 Go 言語では、i++ という後置インクリメントは文として扱われるため、式の中に埋め込むことができないようになっています。 そのため、前置インクリメントと後置インクリメントを区別する必要がそもそもなく、文法として後置インクリメントの形に統一するようになっています。

while ループ(としての for ループ)

Go 言語には while ループは存在しませんが、for ループで代用できます。

i := 0

// i が 3 より小さい間、繰り返す
for i < 3 {
	fmt.Println(i)
	i++
}

for ループの初期化ステートメントや条件式、後処理ステートメントはそれぞれ省略することができるので、上記の for ループは、実は下記のような記述の省略形です(上記のように省略して記述すべきです)。

for ; i < 3; {
	// ...
}

無限ループ(としての for ループ)

Go 言語では、無限ループも for を使用して記述するよう統一されています。

i := 0
for {
	i += 1
	if i > 5 {
		break
	}
	if i % 2 == 0 {
		continue
	}
	fmt.Println(i)
}

実行結果

1
3
5

C 言語の無限ループの記載方法 (for (;;) { }) に慣れているのであれば、上記は下記のような記述の省略形だと考えれば良いでしょう(このように書くべきではありませんが)。

for ;; {
	// ...
}

ループの継続に continue、終了に break キーワードを使用するのも C/C++ 言語と同様です。

2017-08-31