【5分レッスン】Go超入門コース#11 反復

はじめに

こんにちは。キノコードです。
「【5分レッスン】Go超入門コース#11 反復」について説明します。

この動画では、Go言語の繰り返しについて説明します。
Go言語の繰り返し処理には、while文がありません。
Go言語の繰り返し処理は、forだけです。
Go言語は、シンプルな言語といわれる由縁の1つです。
ただ、そのfor文もいろいろな書き方ができます。まずは他の言語と同じような記述できるfor文からみていきます
その後、break文、contine文、for文のネスト、配列との組み合わせ、そして最後に、for文の色々な書き方についてみていきたいと思います。
最後に確認問題もあるのでぜひトライしてみてください。それではいってみましょう

繰り返しとは?

レッスン4「プログラムの基本構造」で説明しましたが、プログラムの基本的な動きは「順次」「分岐」「繰り返し」の3つです。
繰り返しとは、決まった回数や条件を満たしてれば、同じ処理を実行するプログラム構造です。

for文

繰り返しのことを、反復処理とかループ処理といったりします。
Goの繰り返しはfor文のみです。
そのfor文についてみていきましょう。
for文は、条件を満たしていれば、同じ処理をぐるぐる繰り返します。
そして、条件を満たさなくなったタイミングで、繰り返しがおわります。
例えば、for文で同じ処理を5回繰り返したい場合で考えてみます。
どうやったら5回をカウントできるでしょうか。
例えば、「1」からスタートして、1ずつ増やしていき「5」で終われば、5回です。
例えば、「0」からスタートして、1ずつ増やしていき「4」で終われば、これも5回です。
そういった処理をfor文では書いていきます。
for文のきまりをみていきましょう。

for スタート値; 継続条件; 増減式{
 繰り返し中に実行する処理
}

まず、forと書き、第一引数に、スタート値を書きます。
スタート値とは、繰り返し処理をスタートさせる値です。
0から1ずつ増やして4で終わる例でいうと、0です。
ここに、この0を代入する変数を定義をして代入します。
ここで定義した変数のことをカウンタ変数といいます。
for文では、繰り返し処理をカウンタ変数によって制御します。
カウンタ変数は、英語の「index」「integer」の頭文字「 i 」が使われることが多いです。
このスタート値の部分に変数を定義して数値を代入。変数名をi。そして0を代入しましょう。
次の継続条件とは、簡単にいうと、繰り返し処理を終わらせる条件のことです。
4で終わるので、4以下であれば繰り返します。そのため、4以下の比較演算子を書きます。具体的には、i<=4です。
増減式とは、1回の繰り返し処理ごとに実行する処理のことです。
1回の繰り返しごとに1を足していくので、レッスン9で説明したインクリメント演算子を使います。つまり、「i ++」をかきます。
波括弧で繰り返したい処理を書きます。
波括弧の処理が終わったら、一番上に戻り繰り返し処理が終わりになるか判定します。
条件に当てはまれば、次のループをします。条件に合わなくなれば、ループが終了します。
ソースコードを見ていきましょう。

package main
import "fmt"
func main(){
  
  for i :=  0; i <= 4; i ++ {
    fmt.Println(i);
  }
}

このソースコードは、0からスタートして4まで繰り返し。カウンタ変数を表示させてiが変化する様子をみれるものです。
整数型のiを定義して0を代入します。iは4以下の比較演算子。1ずつ足していくiのインクリメント。
iが変化する様子がみれるように、iを表示させてみましょう。
実行してみます。
「0」から「4」までが表示されました

break

次に、break文についてです。
break文は、ある条件にあてはまったとき、繰り返し処理を終了させることができます。
例えば、「0」からスタートさせて、1ずつ増やしていったとき、「3」になったら繰り返しを終了するといったときです。
ソースコードを見ていきましょう。

package main
import "fmt"
func main(){
  
  for i :=  0; i <= 4; i ++ {
    if i == 3  {
      break;
    }
    fmt.Println(i);
  }
}

ここで、iイコール3にになったときに、breakする記述をします。
「3」でループを抜けるので、「0」から「2」まで表示されるはずです。
実行します。
「0」から「2」までが表示されました。

continue

continue文は、繰り返し処理をしているときに、ある条件にあてはまったときにその処理をスキップさせたいときに使います。
例えば、「0」からスタートさせて、1ずつ増やしていったとき、「3」になったら「3」をスキップさせるといったときです。
ソースコードを見ていきましょう。

package main
import "fmt"
func main(){
  
  for i :=  0; i <= 4; i ++ {
    if i == 3 {
      continue;
    }
    fmt.Println(i);
  }
}

ここのif文でiが3になったときに、処理をスキップさせるcontinueを記述をします。
「3」をスキップするので、「0」「1」「2」「4」が表示されるはずです。
実行してみましょう。

for文のネスト

「0」「1」「2」「4」が表示されました。
for文の中にfor文を入れることもできます。
あるものの中に、それと同じ種類のものが入っている構造のことをネストといいます。
for文の中にfor文が入っている構造のことをfor文のネストといいます。
外側の繰り返しのカウンタ変数は「i」で、0から2まで回し、内側の繰り返しのカウンタ変数は「j」で、0から2まで回すという例で考えてみます。
外側のループの1周目の時に、内側のループが0から2までまわります。内側のループがまわりきったら、外側のループが2周目に入ります。
コードを書いてみましょう。

package main
import "fmt"
func main(){
  for i :=  0; i <= 2; i ++ {
    for j :=  0; j <= 2; j ++ {
      fmt.Println(i, "-", j); 
    }
  }
}

ここが外側のループです。
ここが内側のループです。
外側のループのiが0周目のときに、jが0から2までまわり、次にiが1周目の動きになるはずです。
iとjの変化がわかるように、「i、ハイフン、j」表示させてみましょう。
実行してみます。予想通りの結果となりました。

配列

次に、カウンタ変数を使って配列の中身を表示させてみましょう。

package main
import "fmt"
func main(){
  arr := [...]int{2,4,6,8,10}

  for i := 0; i < len(arr); i++ {
    fmt.Println(arr[i])
  }
}

arrという配列変数に「2,4,6,8,10」を代入。
配列のインデックス番号は「0」から始まるので、for文を「0」から「4」の 5つを回します。
「2」から「10」までの偶数が表示されるはずです。実行してみましょう。予想通りの結果となりました。
これにsumという変数を使って足し上げていくこともできます。

package main

import "fmt"

func main() {
        arr := [...]int{2, 4, 6, 8, 10}
        sum := 0

        for i := 0; i <= 4; i++ {
                sum += arr[i]
        }
        fmt.Println(sum)
}

まず、sumという変数を定義します。
そして、演算子のレッスンで説明した、配列の値を複合代入演算子を使って足し上げていきます。
sumは、30となるはずです。
表示させてみましょう。
予想通りの結果となりました。

2つめのfor文の書き方

冒頭でお話ししたようにGo言語のfor文は非常にシンプルに書くことができます。
スタート値、継続条件、増減式がなくてもfor文を書くことができます。

package main

import "fmt"

func main() {
        i := 0
        for {
                fmt.Println(i)
        }
}

このようにスタート値、継続条件、増減式がなくてもfor文を書くことができるのですが、継続条件、つまり終わる条件がないですし、増減式がないため数字も変化せず、無限ループとなってしまいます。
無限ループとは、for文の繰り返しが終わらないないということです。
実行してみましょう(皆さんは実行しない方が良いです)。
このように繰り返し処理はされているのですが、無限ループとなって止まりません。
control+Cで停止させましょう。
無限ループとなってしまうので、
その場合、継続条件のみ記述すればよいです。

package main

import "fmt"

func main() {
        i := 0
        for i <= 4 {
                fmt.Println(i)
                i++
        }
}

ただし、このままだとforが0まま変化しないので、インクリメントで1ずつ足していきます。
こうすることにより、一番最初で説明した0から4まで1ずつ足していくfor文と同じ動きになります。
実行してみましょう。
0から4までが表示されました。

3つめのfor文の書き方

他の書き方もできます。
継続条件を書かずに無限ループの状態にします。
そしてif文で4になったらbreakする記述でも同じ動きになります。

package main

import "fmt"

func main() {
        i := 0
        for {
                fmt.Println(i)
                if i == 4 {
                        break
                }
                i++
        }
}

実行してみましょう。
0,1,2,3,4が表示されました。