Go言語の(ループ構造)


 
 
ほとんどの言語とは異なり、Go のループ ステートメントは for キーワードのみをサポートし、while および do-while 構造はサポートしません。キーワード for の基本的な使用法は、C およびC++の使用法と非常によく似ています。

 

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 の後に条件式が追加され、条件式が満たされるとループが続行され、条件が満たされない場合はループが終了します。

for の end ステートメント - 各ループの最後に実行されるステートメント

各ループの終了前に実行されるステートメント。break、goto、return、panic などのステートメントによってループが強制終了された場合、end ステートメントは実行されません。

 

「 Go言語の(ループ構造)」についてわかりやすく解説!絶対に観るべきベスト2動画

Go言語とは?|プログラミング言語のGo言語について3分でわかりやすく解説します【プログラミング初心者向け】
【元Javaエンジニア】Go言語の将来性・できること・メリットは?