sum := 0
for i := 0; i < 10; i++ {
sum += i
}
比較的大きな違いは、 for の背後にある条件式を括弧()
で囲む必要がないことと、Go 言語では無限ループのシナリオがさらに考慮されるため、開発者が退屈なfor(;;){}
を記述する必要がないことがわかります。 for(;;){}
とdo{} while(1);
、次のように直接簡略化します。
sum := 0
for {
sum++
if sum > 100 {
break
}
}
ループ文を使用する場合は、次の点に注意する必要があります。
- 左中括弧
{
for と同じ行になければなりません。 - Go 言語の for ループは C 言語と同じで、ループ条件で変数を定義および初期化できます。唯一の違いは、Go 言語ではカンマで区切られた複数の代入ステートメントがサポートされていないこと、および複数の代入ステートメントが必要であることです。変数は並行して初期化されます。
- Go 言語の for ループでは、ループを制御するための continue と Break もサポートされていますが、次の例のように、どのループを中断するかを選択できる、より高度な Break が提供されます。
for j := 0; j < 5; j++ {
for i := 0; i < 10; i++ {
if i > 5 {
break JLoop
}
fmt.Println(i)
}
}
JLoop:
// ...
上記のコードでは、break ステートメントは JLoop ラベルで外側のループを終了します。
for の初期ステートメント – ループの開始時に実行されるステートメント
初期ステートメントは、最初のサイクルの前に実行されるステートメントです。通常、変数の初期化を実行するために初期ステートメントを使用します。変数がここで宣言されている場合、そのスコープはこの for のスコープに制限されます。
最初のステートメントは無視できますが、最初のステートメントの後のセミコロンを記述する必要があります。コードは次のとおりです。
step := 2
for ; step > 0; step-- {
fmt.Println(step)
}
step := 2
for ; step > 0; step-- {
fmt.Println(step)
}
このコードでは、初期化のために for の前に step を置きますが、for に初期ステートメントがなく、step のスコープが初期ステートメントで宣言された step のスコープよりも大きくなります。
for の条件式 – ループするかどうかを制御するスイッチ
条件式は各ループの開始前に計算されます。式が true の場合はループが続行され、そうでない場合はループが終了し、条件式は無視できます。条件式を無視すると、デフォルトで無限ループが形成されます。
1) ループの最後に実行可能ステートメントがある無限ループ
次のコードは条件式を無視しますが、end ステートメントは保持します。コードは次のとおりです。
var i int
for ; ; i++ {
if i > 10 {
break
}
}
コードの説明は次のとおりです。
- 3行目では、iの初期値を設定する必要がないので、最初のfor文は無視され、セミコロン2つで囲まれた条件式も無視され、このときループは永遠に継続し、終了します。 for ステートメントは i++ であり、ループが終了する前に毎回呼び出されます。
- 5行目、iが10より大きいと判断した場合、break文を経由してforループを抜けて9行目に進みます。
2) 無限ループ
上記のコードは、より美しい書き方に書き直すこともできます。コードは次のとおりです。
var i int
for {
if i > 10 {
break
}
i++
}
コードの説明は次のとおりです。
- 3行目ではfor文をすべて無視しており、この時点でforは無限ループを実行します。
- 9 行目、for の終了ステートメントから関数本体の最後まで i++ を配置することは同等であり、この方法で記述されたコードはより読みやすくなります。
無限ループは送受信処理でよく発生しますが、ループを終了するには制御可能な終了メソッドが必要です。
3) ループ条件が 1 つだけのループ
上記のコードをベースにコードをさらに簡略化し、if 判定を for に統合すると次のコードになります。
var i int
for i <= 10 {
i++
}
コードの3行目では、先ほどのif i>10{}
で判定した式を反転し、iが10以下と判定された場合にループを継続します。
上記のコードは実際には他のプログラミング言語の while に似ており、while の後に条件式が追加され、条件式が満たされるとループが続行され、条件が満たされない場合はループが終了します。
各ループの終了前に実行されるステートメント。break、goto、return、panic などのステートメントによってループが強制終了された場合、end ステートメントは実行されません。