for 式を使用してデータをループ処理する
もう 1 つの一般的な制御フローはループです。 Go で使用されるループ構造は 1 つだけで、for
ループです。 ただし、複数の方法でループを表すことができます。 このパートでは、Go でサポートされるループ パターンについて学習します。
基本の for ループ構文
if
ステートメントや switch
ステートメントと同様に、for
ループ式にもかっこは必要ありません。 ただし、中かっこは必要です。
セミコロン (;
) によって、for
ループの 3 つのコンポーネントを分離します。
- 最初の反復の前に実行される初期ステートメント (省略可能)。
- すべての反復の前に評価される条件式。 この条件が
false
の場合、ループは停止します。 - すべての反復の最後に実行される後ステートメント (省略可能)。
ご覧のように、Go の for
ループは、C、Java、C# などのプログラミング言語の for
ループに似ています。
Go の for
ループの最も単純な形式は次のようになります。
func main() {
sum := 0
for i := 1; i <= 100; i++ {
sum += i
}
fmt.Println("sum of 1..100 is", sum)
}
Go でループを記述できる他の方法を見てみましょう。
空の前ステートメントと後ステートメント
一部のプログラミング言語では、while
キーワードを使用して、条件式だけが必要なループ パターンを記述します。 Go に while
キーワードはありません。 しかしながら、代わりに for
ループを使用し、Go ではプリステートメントとポストステートメントが任意になるという事実を活用できます。
次のコード スニペットを使用して、前ステートメントと後ステートメントを使用せずに for
ループを使用できることを確認します。
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
var num int64
rand.Seed(time.Now().Unix())
for num != 5 {
num = rand.Int63n(15)
fmt.Println(num)
}
}
num
変数に 5
とは異なる値が保持されている限り、プログラムからはランダムな数が出力されます。
無限ループと break ステートメント
Go で記述できるもう 1 つのループ パターンは、無限ループです。 この場合、条件式、前ステートメント、または後ステートメントは記述しません。 代わりに、ループから出る方法を記述します。 そうしないと、ロジックいつまでも終了しません。 ロジックがループを終了するようにするには、break
キーワードを使用します。
適切な無限ループを記述するには、次のように、for
キーワードに続けて中かっこを使用します。
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
var num int32
sec := time.Now().Unix()
rand.Seed(sec)
for {
fmt.Print("Writing inside the loop...")
if num = rand.Int31n(10); num == 5 {
fmt.Println("finish!")
break
}
fmt.Println(num)
}
}
このコードを実行するたびに、異なる出力が得られます。
continue ステートメント
Go では、continue
キーワードを使用して、ループの現在の反復をスキップできます。 たとえば、このキーワードを使用すると、ループを続ける前に検証を実行できます。 または、無限ループを記述していて、リソースが使用可能になるまで待機する必要がある場合に使用します。
この例では、continue
キーワードが使用されています。
package main
import "fmt"
func main() {
sum := 0
for num := 1; num <= 100; num++ {
if num%5 == 0 {
continue
}
sum += num
}
fmt.Println("The sum of 1 to 100, but excluding numbers divisible by 5, is", sum)
}
この例の for ループでは、1 から 100 まで反復し、各反復で現在の値が合計に加算されます。 5 で割り切れるすべての値は、ループの現在の反復でスキップされ、合計には追加されません。